@V型知识库 原创  

我们在看微信jsapi开发文档发现,想要使用微信jsapi不仅要绑定已备案的域名,而且还需要一大堆接口注入权限验证。本人感觉有点麻烦,但是也没办法,谁让微信这么火呢。关于如何绑定域名,请读者去微信公众管理平台配置,当然你也可以来V型知识库(vxzsk.com)查看配置过程。

通过config接口注入权限验证配置

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

上面就是微信官方文档的说明,本来要高高兴兴的去接入微信开发,这下傻眼了,特别是初学者完全蒙了,接下来我们看看微信官方文档给的代码示例:

wx.config({      


              debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。      


              appId: '', // 必填,公众号的唯一标识      


              timestamp: , // 必填,生成签名的时间戳      


              nonceStr: '', // 必填,生成签名的随机串      


              signature: '',// 必填,签名,见附录1      


              jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2      


       });


timestamp,nonceStr,signature,尼玛 这三个参数什么鬼,appid尚可知道,这三个参数好吧,让我们看附录1,那就看附录1吧,请看下面微信官方文档的附录1说明

jsapi_ticket

生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。

1.参考以下文档获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html

2.用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

看到这里是不是蒙了,什么鬼,预先了解timestamp,nonceStr,signature,还必须获取jsapi_ticket,算了,既然官方文档说要获取jsapi_ticket那么就获取吧,在这里呢我只展示java获取jsapi_ticket。代码如下:

package        com.test.util;      


       import        java.io.BufferedReader;      


       import        java.io.IOException;      


       import        java.io.InputStreamReader;      


       import        java.net.MalformedURLException;      


       import        java.net.URL;      


       import        java.net.URLConnection;      


       import        net.sf.json.JSONObject;      


       import        com.test.weixin.TestAcessToken;      


       /***      


              * @author V型知识库  www.vxzsk.com      


              *      


              */      


       public        class        JsapiTicketUtil {      


              


              /***      


              * 模拟get请求      


              * @param url      


              * @param charset      


              * @param timeout      


              * @return      


              */      


              public        static        String sendGet(String url, String charset,        int        timeout)      


              {      


              String result =        ""       ;      


              try      


              {      


              URL u =        new        URL(url);      


              try      


              {      


              URLConnection conn = u.openConnection();      


              conn.connect();      


              conn.setConnectTimeout(timeout);      


              BufferedReader in =        new        BufferedReader(       new        InputStreamReader(conn.getInputStream(), charset));      


              String line=       ""       ;      


              while        ((line = in.readLine()) !=        null       )      


              {      


              


              result = result + line;      


              }      


              in.close();      


              }        catch        (IOException e) {      


              return        result;      


              }      


              }      


              catch        (MalformedURLException e)      


              {      


              return        result;      


              }      


              


              return        result;      


              }      


              /***      


              * 获取acess_token       


              * 来源www.vxzsk.com      


              * @return      


              */      


              public        static        String getAccessToken(){      


              String appid=       "你公众号基本设置里的应用id"       ;       //应用ID      


              String appSecret=       "你公众号基本设置里的应用密钥"       ;       //(应用密钥)      


              String url =       "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="       +appid+       "&secret="       +appSecret+       ""       ;      


              String backData=TestAcessToken.sendGet(url,        "utf-8"       ,        10000       );      


              String accessToken = (String) JSONObject.fromObject(backData).get(       "access_token"       );        


              return        accessToken;      


              }      


              /***      


              * 获取jsapiTicket      


              * 来源 www.vxzsk.com      


              * @return      


              */      


              public        static        String getJSApiTicket(){       


              //获取token      


              String acess_token= JsapiTicketUtil.getAccessToken();      


              


              String urlStr =        "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="       +acess_token+       "&type=jsapi"       ;        


              String backData=TestAcessToken.sendGet(urlStr,        "utf-8"       ,        10000       );        


              String ticket = (String) JSONObject.fromObject(backData).get(       "ticket"       );        


              return         ticket;        


              


              }        


              public        static        void        main(String[] args) {      


              String jsapiTicket = JsapiTicketUtil.getJSApiTicket();      


              System.out.println(       "调用微信jsapi的凭证票为:"       +jsapiTicket);      


              }
              


把上面的代码直接复制到Eclipse或者myeclipse中只想main方法即可,但是这里有个梗?

第58行到65行这段代码是获取access_token的方法,因为要获取ticket需要这个参数,但是这里有两个参数需要读者填写,一个是appid,另一个是appSecret,代码的注释已经说得很明白了,我在这里就不在累述。