Java微信公众平台开发(十一)--微信JSSDK中Config配置

JSSDK曾经引爆前端以及后端的工程师,其魔性的力量毋庸置疑,在我们的技术眼里它的实现原理和根本是不能够被改变的,这篇文章就不对其js的实现做任何评价和解说了(因为我也不是很懂,哈哈),这里要说的是它的config配置实现,参考文档:http://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html!微信JS-SDK是微信公众...

Java微信公众平台开发(十一)--微信JSSDK中Config配置

JSSDK曾经引爆前端以及后端的工程师,其魔性的力量毋庸置疑,在我们的技术眼里它的实现原理和根本是不能够被改变的,这篇文章就不对其js的实现做任何评价和解说了(因为我也不是很懂,哈哈),这里要说的是它的config配置实现,参考文档:http://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html !

微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包,通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验;本篇将面向网页开发者介绍微信JS-SDK如何使用及相关注意事项!JSSDK使用步骤:

  • 步骤一:在微信公众平台绑定安全域名

  • 步骤二:后端接口实现JS-SDK配置需要的参数

  • 步骤三:页面实现JS-SDk中config的注入配置,并实现对成功和失败的处理

(一)在微信公众平台绑定安全域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”(如下图),如果需要使用支付类接口,需要确保支付目录在支付的安全域名下,否则将无法完成支付!(注:登录后可在“开发者中心”查看对应的接口权限),因为我用的是测试号,所以登录以后界面就如下图:

(二)后端接口实现JS-SDK配置需要的参数

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

我们查看js-sdk的配置文档和以上的代码可以发现config的配置需要4个必不可少的参数appId、timestamp、nonceStr、signature,这里的signature就是我们生成的签名!

生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket ,所以这里我们将jsapi_ticket的获取放到定时任务中,因为它和token的生命周期是一致的,所以在这里我们将他们放到一起。

①将原有的定时任务WeChatTask中获取token的代码做如下修改:

 1 package com.gede.wechat.common; 2 import java.text.SimpleDateFormat; 3 import java.util.Date; 4 import java.util.HashMap; 5 import java.util.Map; 6  7 import com.gede.web.util.GlobalConstants; 8 import com.gede.wechat.util.HttpUtils; 9 10 import net.sf.json.JSONObject;11 /**12 * @author gede13 * @version date:2019年5月26日 下午7:50:3814 * @description :15 */16 public class WeChatTask {17  /**18   * @Description: 任务执行体19   * @param @throws Exception20*/21  public void getToken_getTicket() throws Exception {22 Map<String, String> params = new HashMap<String, String>();23 //获取token执行体24 params.put("grant_type", "client_credential");25 params.put("appid", GlobalConstants.getInterfaceUrl("appid"));26 params.put("secret", GlobalConstants.getInterfaceUrl("AppSecret"));27 String jstoken = HttpUtils.sendGet(28GlobalConstants.getInterfaceUrl("tokenUrl"), params);2930 String access_token = JSONObject.fromObject(jstoken).getString(31"access_token"); // 获取到token并赋值保存32 GlobalConstants.interfaceUrlProperties.put("access_token", access_token);33 34 //获取jsticket的执行体35 params.clear();36 params.put("access_token", access_token);37 params.put("type", "jsapi");38 String jsticket = HttpUtils.sendGet(39GlobalConstants.getInterfaceUrl("ticketUrl"), params);40 String jsapi_ticket = JSONObject.fromObject(jsticket).getString(41"ticket"); 42 GlobalConstants.interfaceUrlProperties.put("jsapi_ticket", jsapi_ticket); // 获取到js-SDK的ticket并赋值保存43  44 System.out.println("jsapi_ticket================================================"   jsapi_ticket);45 System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) "token为==============================" access_token);46  }47 }

然后我们根据【JS-SDK使用权限签名算法】对参数进行签名得到signature,这里的url必须采用前端传递到后端,因为每次的url会有所变化,

②所以我们自定义一个权限签名算法JSSDK_Config类,如下:

 1 package com.gede.wechat.common; 2  3 import java.security.MessageDigest; 4 import java.util.Formatter; 5 import java.util.HashMap; 6 import java.util.UUID; 7 import com.gede.web.util.GlobalConstants; 8  9 /**10 * @author gede11 * @version date:2019年5月30日 下午2:52:5712 * @description :13 */14 public class JSSDK_Config {1516  /**17   * @Description: 前端jssdk页面配置需要用到的配置参数18   * @param @return hashmap {appid,timestamp,nonceStr,signature}19   * @param @throws Exception20   * @author gede21*/22  public static HashMap<String, String> jsSDK_Sign(String url) throws Exception {23String nonce_str = create_nonce_str();24String timestamp=GlobalConstants.getInterfaceUrl("timestamp");25String jsapi_ticket=GlobalConstants.getInterfaceUrl("jsapi_ticket");26// 注意这里参数名必须全部小写,且必须有序27String  string1 = "jsapi_ticket="jsapi_ticket"&noncestr="   nonce_str28 "&timestamp="timestamp "&url="   url;29MessageDigest c
源文地址:https://www.guoxiongfei.cn/cntech/18380.html