美文网首页
微信JSSDKconfig接口注入权限验证配置的参数获取--ja

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

作者: 毛于晏 | 来源:发表于2018-11-23 14:59 被阅读296次

    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<String, String> 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<String, String> params) {   
            List<String> keys = new ArrayList<String>(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;   
        }   
    }
    
    <dependency>
        <groupId>org.weixin4j</groupId>
        <artifactId>weixin4j</artifactId>
        <version>0.1.3</version>
    </dependency>
    

    相关文章

      网友评论

          本文标题:微信JSSDKconfig接口注入权限验证配置的参数获取--ja

          本文链接:https://www.haomeiwen.com/subject/kmsjqqtx.html