1、获取公众号appid和secret
登录微信公众平台-基本配置
2、配置JS安全域名
公众号设置-功能设置
注意:MP_verify_0MVuWBvVPoPJOmPF.txt服务器不能拦截
3、IP白名单配置
打开baidu.com,搜索IP,将搜索结果在公众平台-基本配置-IP白名单内配置
4、前端代码展示
wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: 'appId', // 必填,公众号的唯一标识 正式需要修改新申请公众号 timestamp: timestamp, // 必填,生成签名的时间戳 nonceStr: nonceStr, // 必填,生成签名的随机串 signature: signature,// 必填,签名 jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage'] // 必填,需要使用的JS接口列表 });
wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口(即将废弃) wx.onMenuShareTimeline({ title: '', // 分享标题 link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: '', // 分享图标 success: function () { // 用户点击了分享后执行的回调函数 }, }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口(即将废弃) wx.onMenuShareAppMessage({ title: '百度测试', // 分享标题 desc: '百度测试', // 分享描述 link: 'http://sf8e39.natappfree.cc/admin', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: '', // 分享图标 type: 'link', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { // 用户点击了分享后执行的回调函数 } }); });
function getSignature() { $.ajax({ url: '' //请求链接 , type: 'POST' // 请求类型 , dataType: 'json' // 返回请求的类型,有text/json两种 , async: false // 是否异步 , cache: false // 是否缓存 , timeout: null // 设置请求超时 , success: function (result) { //获取红包rmb中的信息 if(result.code === 0){ var data = result.data; timestamp = data.timestamp; nonceStr = data.nonceStr; signature = data.signature; } } }); }
5、后台代码展示
1)接口
@RequestMapping(value = "/signature") @ResponseBody public Object signature() { logBefore(logger, "获取微信所需signature"); Map<Object, Object> map = new HashMap<Object, Object>(); PageData pd = new PageData(); try { pd = WechatTool.getSignature(); map.put("code", 0); map.put("msg", "成功"); map.put("data", pd); } catch (Exception e) { logger.error(e.toString(), e); map.put("code", 1); map.put("msg", e.toString()); } finally { logAfter(logger); } return AppUtil.returnObject(new PageData(), map); }
2)辅助工具
package com.fh.controller.wechat.tool; import com.fh.util.HttpUtils; import com.fh.util.Jurisdiction; import com.fh.util.PageData; import com.fh.util.UuidUtil; import com.fh.util.pay.alipay.util.AlipayCore; import com.fh.util.pay.tenpay.util.Sha1Util; import net.sf.json.JSONObject; import org.apache.shiro.session.Session; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; /** * Created by 菜园子 on 2018/8/30. */ public class WechatTool { /*获取access_token入口*/ public static String getAccessTokenMain(){ String result = ""; boolean b;//是否调用微信重新获取access_token Session session = Jurisdiction.getSession(); JSONObject sessionData = (JSONObject) session.getAttribute(WechatConfigure.CACHE_ACCESS_TOKEN); if (sessionData != null){ Long timestamp = sessionData.getLong("timestamp"); if (isValid(timestamp,System.currentTimeMillis())){ result = sessionData.getString("accessToken"); b = false; }else { b = true; } }else { b = true; sessionData = new JSONObject(); } if (b){ String message = getAccessToken(); JSONObject data = JSONObject.fromObject(message); sessionData.put("accessToken",data.getString("access_token")); sessionData.put("timestamp",System.currentTimeMillis()); session.setAttribute(WechatConfigure.CACHE_ACCESS_TOKEN,sessionData); result = data.getString("access_token"); } return result; } /*获取access_token*/ public static String getAccessToken(){ String message = ""; String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + WechatConfigure.APPID + "&secret=" + WechatConfigure.SECRET; message = request(url); return message; } /*获取jsapi_ticket入口*/ public static String getTicketMain(){ String result = ""; boolean b;//是否调用微信重新获取access_token Session session = Jurisdiction.getSession(); JSONObject sessionData = (JSONObject) session.getAttribute(WechatConfigure.CACHE_JSAPI_TICKET); if (sessionData != null){ Long timestamp = sessionData.getLong("timestamp"); if (isValid(timestamp,System.currentTimeMillis())){ result = sessionData.getString("ticket"); b = false; }else { b = true; } }else { b = true; sessionData = new JSONObject(); } if (b){ String accessToken = getAccessTokenMain(); String message = getTicket(accessToken); JSONObject data = JSONObject.fromObject(message); sessionData.put("ticket",data.getString("ticket")); sessionData.put("timestamp",System.currentTimeMillis()); session.setAttribute(WechatConfigure.CACHE_JSAPI_TICKET,sessionData); result = data.getString("ticket"); } return result; } /*获取jsapi_ticket*/ public static String getTicket(String accessToken){ String message = ""; String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi"; message = request(url); return message; } /*获取signature*/ public static PageData getSignature(){ PageData result = new PageData(); String nonceStr = SignTool.getRandomStringByLength(32); Long timestamp = System.currentTimeMillis(); String params = "jsapi_ticket="+getTicketMain()+"&noncestr="+nonceStr+"×tamp="+timestamp+"&url="+WechatConfigure.GET_SINATURE_URL; result.put("signature", Sha1Util.getSha1(params)); result.put("timestamp",timestamp); result.put("nonceStr",nonceStr); return result; } /*请求数据*/ public static String request(String url){ String message = ""; try { URL getUrl = new URL(url); HttpURLConnection http = (HttpURLConnection) getUrl.openConnection(); http.setRequestMethod("GET"); http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); http.setDoOutput(true); http.setDoInput(true); http.connect(); InputStream is = http.getInputStream(); int size = is.available(); byte[] b = new byte[size]; is.read(b); message = new String(b, "UTF-8"); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return message; } /*判断session内容是否有效*/ private static boolean isValid(Long timestamp,Long nowTimestamp){ boolean b; if (nowTimestamp > timestamp){ if ((nowTimestamp -timestamp) / 1000 > 7200){ b = false; }else { b = true; } }else { b = false; } return b; } public static void main(String[] args) throws InterruptedException { PageData data = getSignature(); System.out.println(); } }
package com.fh.controller.wechat.tool; /** * Created by 菜园子 on 2018/8/30. */ public class WechatConfigure { public static final String APPID = "appId";//微信公众号appid public static final String SECRET = "secret";//微信公众号secret public static final String CACHE_ACCESS_TOKEN = "cache_access_token"; public static final String CACHE_JSAPI_TICKET = "cache_jsapi_ticket"; public static final String GET_SINATURE_URL = "";//wx.configure配置页面路径 }