JAVA调用微信扫一扫

来源:互联网 发布:上海森伯格矩阵 编辑:程序博客网 时间:2024/05/16 18:11

java微信开发官方文档地址:https://mp.weixin.qq.com/wiki/home/

开发微信付款和扫一扫,必须有内网穿透,最好有服务器

微信开发扫一扫开发过程:


// WeixinUtil.getAccess_token此工具类,将放在下面一点。

这里是一个类,开始

//方法开始。传入参数URL,这个URL,会做详细解释。

public Map<String, String> sign(String url) {

//如何获取access_token:

//后台得到access_token,访问方法内的地址appid=微信公众平台基本资料内。secret=微信公众平台基本资料内的appsecret
String aToken = WeixinUtil.getAccess_token("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=**************&secret=*******");  
    String[] tokenOne = aToken.split(":"); //此处是将返回参数进行一个拆分
    String[] token = tokenOne[1].split(",");
    char [] stringArr = token[0].toCharArray();
    String token3 = "" ;
    for(int i=1;i<stringArr.length-1;i++){
    String token2 = String.valueOf(stringArr[i]);
    token3 += token2;
    }   //token就是我们想要的数据了

//如何根据access_token得到jsapi_ticket

//访问方法内地址,其他参数固定,只需修改access_token,就是上面方法得到的参数

String jsapi_ticket =WeixinUtil.getAccess_token("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+token3+"&type=jsapi");
        String[] jsapi1 = jsapi_ticket.split(":");//同样讲获得的参数进行一个拆分。
    String[] jsapi2 = jsapi1[3].split(",");
    char [] stringArray = jsapi2[0].toCharArray();
    String ticket3 = "" ;
    for(int i=1;i<stringArray.length-1;i++){
    String ticket = String.valueOf(stringArray[i]);
    ticket3 += ticket;
   

//signature----->签名生成方法。

String nonce_str = create_nonce_str(); //此处调用下面生成随机串的方法 
        String timestamp = create_timestamp(); 
//此处调用下面生成时间的方法

//新建一个MAP

Map<String, String> ret = new HashMap<String, String>(); 

String string1;  
        String signature = "";

        //注意这里参数名必须全部小写,且必须有序  


                string1 = "jsapi_ticket=" + ticket3 +  
                          "&noncestr=" + nonce_str +  
                      "&timestamp=" + timestamp +  
                        "&url=" + url;  //此处的URL是方法是别处调用此方法,所传的参。

  try {  
             MessageDigest crypt = MessageDigest.getInstance("SHA-1");  
              crypt.reset();  
              crypt.update(string1.getBytes("UTF-8"));  //这里传入String1,转格式
             signature = byteToHex(crypt.digest());  //此处调用下面随机加密的方法。赋值给signature 
          }  
          catch (NoSuchAlgorithmException e) {  
              e.printStackTrace();  
          }  
          catch (UnsupportedEncodingException e) {  
             e.printStackTrace();  
          }

//放值进入MAP。

 ret.put("url", url);  
 ret.put("jsapi_ticket", ticket3);  
 ret.put("nonceStr", nonce_str);  
 ret.put("timestamp", timestamp);  
 ret.put("signature", signature);  
 ret.put("appId", 你的appid);   
 return ret;

}//方法结束

//timestamp---->时间戳生成方法。

    /** 
        * 由程序自己获取当前时间 
         * @return 
        */  
        private static String create_timestamp() {  
          
    return Long.toString(System.currentTimeMillis() / 1000);  
       
   

//nonceStr ---->随机串生成方法。此处nonceStr中的S大写。

           /** 
            * 产生随机串--由程序自己随机产生 
            * @return 
            */  
           private static String create_nonce_str() {  
               return UUID.randomUUID().toString();  
           }

           /** 
                * 随机加密 
                * @param hash 
                * @return 
                */  
           private static String byteToHex(final byte[] hash) {  
               Formatter formatter = new Formatter();  
               for (byte b : hash){  
                    formatter.format("%02x", b);  
               }  
                String result = formatter.toString();  
                 formatter.close();  
                return result;  
           }  

一个类,结束


WeixinUtil工具类

import java.net.HttpURLConnection;

import java.io.InputStream;
import java.net.URL;

//我的这个工具类,主要是java访问网址并接受参数,只是输入URL,上面就是调用此方法,不明白看上面传的参数。
public class WeixinUtil {
  public static  String getAccess_token(String url) {
  String accessToken = null;
      try {
          URL urlGet = new URL(url);
          HttpURLConnection http = (HttpURLConnection) urlGet
                  .openConnection();
          http.setRequestMethod("GET"); // 必须是get方式请求
          http.setRequestProperty("Content-Type",
                  "application/x-www-form-urlencoded");
          http.setDoOutput(true);
          http.setDoInput(true);
          System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
          System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
          http.connect();
          InputStream is = http.getInputStream();
          int size = is.available();
          byte[] jsonBytes = new byte[size];
          is.read(jsonBytes);
          accessToken = new String(jsonBytes, "UTF-8");
          System.out.println(accessToken);
          is.close();
      } catch (Exception e) {

          e.printStackTrace();

      }

      return accessToken;

  }
}


调用微信扫一扫处

public void gosao(){

ScanCodeController scan =new ScanCodeController();
//此处的地址,在哪里调用微信扫一扫
  如果调用地方是页面(http://www.域名.com/页面名称/如果是方法如下,一句话浏览器地址栏显示的是什么就写什么。
Map<String, String> map = scan.sign("http://www.
*******.com/*****/front/express/goPay?val="+val);
String timestamp = map.get("timestamp");
String signature = map.get("signature");
String nonceStr = map.get("nonceStr");
setAttr("scantimestamp", timestamp);
setAttr("scansignature", signature);
setAttr("scannonceStr", nonceStr);
     //request.setAttribute(name, value);
render("/front/pay.html");
//返回页面。页面可用AJAX请求。这是我的项目返回页面方法。

}

网页页面调用处

//此处进页面就被加载,不需要放在方法内

 wx.config({
         debug : false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
         appId : '
**************
', // 必填,公众号的唯一标识
         timestamp : '${scantimestamp}', // 必填,生成签名的时间戳
         nonceStr : '${scannonceStr}', // 必填,生成签名的随机串
         signature : '${scansignature}',// 必填,签名,见附录1
         jsApiList : ['scanQRCode']// 必填,需要使用的JS接口列表,所有JS接口列表见附录2
    });

生成上面所需数据:



//此处可用一个点击是件包含微信扫一扫,当点击某个按钮或者其他。进入此方法,调用微信扫一扫

document.querySelector('#scan').onclick = function (){ 

wx.scanQRCode({
             needResult : 1,   // 默认为0,扫描结果由微信处理,1则直接返回扫描结果
             desc : 'scanQRCode desc',
             scanType: ["qrCode","barCode"],
             success : function(res) {
                  //扫码后获取结果参数赋值给Input
                 var url = res.resultStr;
                 //商品条形码,扫描后返回的值,截取,号后面
                   if(url.indexOf(",")>=0){
                     var tempArray = url.split(',');
                     var tempNum = tempArray[1];
                   $("#phonesao").val(tempNum); //将值赋值给id为phonesao的input标签
                 }else{
                     $("#phonesao").val(url); //上面判断不成立,直接将URL赋值给id为phonesao的input标签
                 }
             },
error: function(){
  alert("调取失败");
  }
        });
     }

页面调用处结束

这些方法,前面两个基本都可以算一个工具类。你在哪里调用,只需要调用方法,传一个URL值就可以完成扫一扫。这个URL,必须是浏览器地址是什么你就是什么。有参数,你也要有参数。上面有。下面在说一说配微信公众平台

微信公众平台配置

1.登陆微信公众平台,点击基本配置就有

2.如果调用扫一扫,唯一的配置


点击红色位置的名称;


设置你的安全域名,只需要:例:www.baidu.com  这里只需要输入baidu.com。OK

下一篇说微信支付。


2 0
原创粉丝点击