微信JSSDKconfig接口注入权限验证配置的参数获取--java版

1.先看开发文档,操作流程

官方文档
点击查看

1).绑定域名
步骤一:绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

备注:登录后可在“开发者中心”查看对应的接口权限。
2).步骤二:引入JS文件
步骤二:引入JS文件

在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js](http://res.wx.qq.com/open/js/jweixin-1.4.0.js)

如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.4.0.js](http://res2.wx.qq.com/open/js/jweixin-1.4.0.js) (支持https)。

备注:支持使用 AMD/CMD 标准模块加载方法加载
3).步骤三:通过config接口注入权限验证配置
步骤三:通过config接口注入权限验证配置

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

备注:在开发过程中, 一直报签名不合法, 这个地方是前台传的URL不对, 要js代码使用encodeURIComponent();方法对传到后台的url转码, 并且前台请求后台参数一定要用get方法;

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

2.java获取wx.config({})中方法的参数

生成signature签名需要从微信接口获得的的参数:
1.access_token
2.jsapi_ticket
这俩参数有效期为2小时7200秒, 每天获得有上限次数
代码如下: 代码后有使用到的类和jar包

    /**
     * 获取微信服务号分享的参数
     * @author MaoLG
     * @2018-11-23下午2:39:40
     * @param url 动态获取,  分享的页面实际路径, 不能带# 可以带参数
     * @return
     */
//access_token和jsapi_ticket两个小时有效期,用redis作为缓存
Object share(String url) {
        ShareParam shareParam = null;
        try {
            String shareAccessToken = RedisUtils.get("shareAccessToken");// 获取分享使用的token
            // redis取出的是Empty, 从新获取token
            if (StringUtils.isEmpty(shareAccessToken)) {
                //appid:服务号的appid; secret:服务号的AppSecret
                String getShareAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?"
                        + "grant_type=client_credential&appid="
                        + appid
                        + "&secret=" + secret;
                String accessTokenJson = HttpClientUtils
                        .doGet(getShareAccessTokenUrl);
                //这里用的阿里的fastjson
                AccessToken token = JSON.parseObject(accessTokenJson,
                        AccessToken.class);
                shareAccessToken = token.getAccess_token();
                RedisUtils.set("shareAccessToken", shareAccessToken);
                // 设置token7150秒过期
                RedisUtils.expire("shareAccessToken", 7150);
            }

            // redis 获取jsapiTicket
            String ticket = RedisUtils.get("jsapiTicket");
            // ticket is Empty 从新获取
            if (StringUtils.isEmpty(ticket)) {
                // 如果不是empty, 直接使用redis中的token获取jsapi
                String getJsapiUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?"
                        + "access_token=" + shareAccessToken + "&type=jsapi";
                String jsapiTicketJson = HttpClientUtils.doGet(getJsapiUrl);
                JsapiTicket jsapiTicket = JSON.parseObject(jsapiTicketJson,
                        JsapiTicket.class);
                // jsapiTicket 获取失败,
                //DataException自定义的异常类型
                if (jsapiTicket.getErrcode() != 0) {
                    throw new DataException("jsapiTicket 获取失败");
                }
                // 签名需要的参数ticket
                ticket = jsapiTicket.getTicket();
                // 设置过期时间
                RedisUtils.set("jsapiTicket", ticket);
                RedisUtils.expire("jsapiTicket", 7140);
            }

            // 获取随机字符串,这里是UUID 工具就不贴出来了(32位)
            String nonceStr = StringUtils.idGenerate();

            // 获时间戳
            String timestamp = System.currentTimeMillis() / 1000 + "";

            // 参数
            Map packageParams = new HashMap<>();
            packageParams.put("url", url);
            packageParams.put("noncestr", nonceStr);
            packageParams.put("jsapi_ticket", ticket);
            packageParams.put("timestamp", timestamp);
            // 获得拼接好的参数,按照ASCLL大小排序
            String createLinkString = PayUtil.createLinkString(packageParams);
            //SHA1签名,该类继承了weixin4J的WeixinSupport类, 使用的是父类的方法
            String signature = SHA1.encode(createLinkString);
            // 参数封装,返回前台
            shareParam = new ShareParam();
            shareParam.setAppId(appid);
            shareParam.setNonceStr(nonceStr);
            shareParam.setSignature(signature);
            shareParam.setTimestamp(timestamp);

        } catch (DataException e) {
            e.printStackTrace();
            return null;
        }
        return shareParam;
    }

使用的实体类, get/set方法就不贴出来了

package util.weixin.vo;

import java.io.Serializable;

/**
 * 获取微信token的类
 * @Author MaoLG
 * @Date 2018/11/14  11:37
 */
public class AccessToken implements Serializable{

    private String access_token;

    private String expires_in;
}
package util.weixin.vo;

import java.io.Serializable;

/**
 * 微信公众号分享使用的参数
 * @author MaoLG
 *
 * 2018-11-23上午10:28:48
 */
public class JsapiTicket implements Serializable{
    
    private Integer errcode;
    
    private String errmsg;
    
    private String ticket;
    
    private Integer expires_in;
}
package util.weixin;
import java.util.*;
import java.util.Collections;
public class PayUtil {
    /**  
     * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串  
     * @param params 需要排序并参与字符拼接的参数组  
     * @return 拼接后字符串  
     */   
    public static String createLinkString(Map params) {   
        List keys = new ArrayList(params.keySet());   
        Collections.sort(keys);   
        String prestr = "";   
        for (int i = 0; i < keys.size(); i++) {   
            String key = keys.get(i);   
            String value = params.get(key);   
            if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符   
                prestr = prestr + key + "=" + value;   
            } else {   
                prestr = prestr + key + "=" + value + "&";   
            }   
        }   
        return prestr;   
    }   
}

    org.weixin4j
    weixin4j
    0.1.3

你可能感兴趣的:(微信JSSDKconfig接口注入权限验证配置的参数获取--java版)