微信分享接口配置和调用

以你之姓@ 2022-06-04 01:09 538阅读 0赞

#

#

步骤一:绑定域名

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

步骤二:引入JS文件

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

请注意,如果你的页面启用了https,务必引入 https://res.wx.qq.com/open/js/jweixin-1.0.0.js ,否则将无法在iOS9.0以上系统中成功使用JSSDK

如需使用摇一摇周边功能,请引入 jweixin-1.1.0.js

备注:支持使用 AMD/CMD 标准模块加载方法加载

步骤三:通过config接口注入权限验证配置

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

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

步骤四:通过ready接口处理成功验证

  1. wx.ready(function(){
  2. // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
  3. });

步骤五:通过error接口处理失败验证

  1. wx.error(function(res){
  2. // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
  3. });

步骤六:具体接口调用,调用之前要获取接口调用凭据,具体如下

1.配置文件 application-common.properties 配置一些接口常量信息

[html] view plain copy

  1. #\u5FAE\u4FE1AppID
  2. AppID=wx0a5aabbccddees
  3. #\u5FAE\u4FE1AppSecret
  4. AppSecret=f1ec0d65d104589ds0opke907dslsjeln09

2.工具类ConfigHelper,读取配置文件:

[java] view plain copy

  1. package com.hengxin.qianee.commons;
  2. import java.util.ResourceBundle;
  3. /**
  4. * 读取配置文件
  5. * @author hzg
  6. *
  7. */
  8. public class ConfigHelper {
  9. private static Object lock = new Object();
  10. private static ConfigHelper config = null;
  11. private static ResourceBundle rb = null;
  12. private ConfigHelper(String configFileName) {
  13. rb = ResourceBundle.getBundle(configFileName);
  14. }
  15. public static ConfigHelper getInstance(String configFileName) {
  16. synchronized(lock) {
  17. if(null == config) {
  18. config = new ConfigHelper(configFileName);
  19. }
  20. }
  21. return (config);
  22. }
  23. public String getValue(String key) {
  24. return (rb.getString(key));
  25. }
  26. }

3.获取签名信息

[java] view plain copy

  1. package com.hengxin.qianee.talent.wechat.utils;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.UnsupportedEncodingException;
  6. import java.util.Date;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. import java.util.UUID;
  10. import javax.servlet.http.HttpServletRequest;
  11. import org.apache.http.HttpEntity;
  12. import org.apache.http.HttpResponse;
  13. import org.apache.http.HttpStatus;
  14. import org.apache.http.client.HttpClient;
  15. import org.apache.http.client.methods.HttpGet;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import com.alibaba.fastjson.JSON;
  18. import com.alibaba.fastjson.JSONObject;
  19. import com.hengxin.qianee.cache.impl.MyCache;
  20. import com.hengxin.qianee.commons.ConfigHelper;
  21. import com.hengxin.qianee.service.thirdparty.pay.llpay.conn.CustomHttpClient;
  22. public class WechatSignUtil {
  23. @Autowired
  24. MyCache cache;
  25. public static JSONObject sendGetRequest(String url){
  26. HttpClient httpClient = CustomHttpClient.GetHttpClient();
  27. HttpGet get = new HttpGet(url);
  28. get.setHeader(“Content-Type”,
  29. “application/x-www-form-urlencoded;charset=utf-8”);
  30. BufferedReader br = null;
  31. try {
  32. // 发送请求,接收响应
  33. HttpResponse resp = httpClient.execute(get);
  34. int ret = resp.getStatusLine().getStatusCode();
  35. if(ret == HttpStatus.SC_OK){
  36. // 响应分析
  37. HttpEntity entity = resp.getEntity();
  38. br = new BufferedReader(new InputStreamReader(
  39. entity.getContent(), “UTF-8”));
  40. StringBuffer responseString = new StringBuffer();
  41. String str = br.readLine();
  42. while (str != null) {
  43. responseString.append(str);
  44. str = br.readLine();
  45. }
  46. return JSON.parseObject(responseString.toString());
  47. }
  48. }catch(Exception e){
  49. e.printStackTrace();
  50. }finally {
  51. if (br != null) {
  52. try {
  53. br.close();
  54. } catch (IOException e) {
  55. // do nothing
  56. }
  57. }
  58. }
  59. return new JSONObject();
  60. }
  61. /**
  62. * 获取签名信息
  63. * @return 返回签名等
  64. */
  65. public Map getWechatSign(HttpServletRequest request,MyCache cache) throws UnsupportedEncodingException{
  66. String appid = ConfigHelper.getInstance(“config”).getValue(“AppID”);
  67. String appSecret = ConfigHelper.getInstance(“config”).getValue(“AppSecret”);
  68. String url_Template_GetAccessToken =”https://api.weixin.qq.com/cgi-bin/token?grant\_type=client\_credential&appid=%s&secret=%s“;
  69. String url_Template_GetAccessTicket = “https://api.weixin.qq.com/cgi-bin/ticket/getticket?access\_token=%s&type=jsapi“;
  70. String accessToken = cache.getString(“wechatAccessToken”);
  71. if(accessToken == null){
  72. //获取token
  73. String url_GetAccessToken = String.format(url_Template_GetAccessToken, appid,appSecret);
  74. JSONObject accessTokenMap = WechatSignUtil.sendGetRequest(url_GetAccessToken);
  75. accessToken = accessTokenMap.getString(“access_token”);
  76. cache.setString(“wechatAccessToken”, 6000, accessToken);
  77. }
  78. String accessTicket = cache.getString(“wechatAccessTicket”);
  79. if(accessTicket == null){
  80. //获取ticket
  81. String url_GetAccessTicket = String.format(url_Template_GetAccessTicket, accessToken);
  82. JSONObject url_GetAccessTicketMap = WechatSignUtil.sendGetRequest(url_GetAccessTicket);
  83. accessTicket = url_GetAccessTicketMap.getString(“ticket”);
  84. cache.setString(“wechatAccessTicket”, 6000, accessTicket);
  85. }
  86. // 时间戳
  87. Long timeStamp = new Date().getTime()/1000;
  88. String url = request.getRequestURL().toString();
  89. //随机字串
  90. String noncestr = UUID.randomUUID().toString();
  91. //签名
  92. String signature = getSignature(noncestr,accessTicket,url,timeStamp);
  93. Map result = new HashMap();
  94. result.put(“appId”, appid);
  95. result.put(“timestamp”, timeStamp.toString());
  96. result.put(“nonceStr”, noncestr);
  97. result.put(“signature”, signature);
  98. return result;
  99. }
  100. /**
  101. * 生成签名
  102. * @param nonceStr 随机字串
  103. * @param jsapi_ticket 票据
  104. * @param url
  105. * @param timestamp 时间戳
  106. * @return
  107. */
  108. private String getSignature(String nonceStr,String jsapi_ticket,String url,Long timestamp){
  109. String template = “jsapi_ticket=%s&noncestr=%s×tamp=%s&url=%s”;
  110. String result = String.format(template, jsapi_ticket,nonceStr,timestamp,url);
  111. return org.apache.commons.codec.digest.DigestUtils.shaHex(result);
  112. }
  113. }

总结:先配置好域名,先根据appid和appSecret拼成的串发送请求获取到一个JSONObject对象,通过该对象调用getString(“access_token”)方法取到token;

根据token拼成的url发送一个http get请求得到JSONObject对象,通过调用该对象的.getString(“ticket”)方法得到ticket

根据时间戳、随机串、当然访问的url和ticket生产签名,也就是接口调用的凭据。最后jsp页面调用如下:

[html] view plain copy

  1. <**script** type=”text/javascript”
  2. src=”http://res.wx.qq.com/open/js/jweixin-1.0.0.js"**>****</script>**
  3. <**style type=”text/css”>**
  4. </**style**>
  5. <**script type=”text/javascript”>**
  6. wx.config({
  7. debug : false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  8. appId : “${appId}“, // 必填,公众号的唯一标识
  9. timestamp : “${timestamp}“, // 必填,生成签名的时间戳
  10. nonceStr : “${nonceStr}“, // 必填,生成签名的随机串
  11. signature : “${signature}“,// 必填,签名,见附录1
  12. jsApiList : [ ‘onMenuShareTimeline’, ‘onMenuShareAppMessage’,
  13. ‘onMenuShareQQ’, ‘onMenuShareWeibo’, ‘onMenuShareQZone’ ]
  14. });
  15. var obj = {
  16. title : ‘标题’,
  17. desc : ‘欢迎关注!’,
  18. link : ‘http://m.test.com‘,
  19. imgUrl : ‘https://qianee-official.oss-cn-beijing.aliyuncs.com/data/2016-05-21%2Fe382d374-f3c5-45bb-b8cedlsjelnge‘,
  20. };
  21. wx.ready(function(){
  22. wx.onMenuShareAppMessage(obj);
  23. // 2.2 监听“分享到朋友圈”按钮点击、自定义分享内容及分享结果接口
  24. wx.onMenuShareTimeline(obj);
  25. // 2.3 监听“分享到QQ”按钮点击、自定义分享内容及分享结果接口
  26. wx.onMenuShareQQ(obj);
  27. // 2.4 监听“分享到微博”按钮点击、自定义分享内容及分享结果接口
  28. wx.onMenuShareWeibo(obj);
  29. });

发表评论

表情:
评论列表 (有 0 条评论,538人围观)

还没有评论,来说两句吧...

相关阅读

    相关 开发接口封装调用

    我们知道微信公众号开发主要就是调用微信官方开放给我们的一些接口。这里就不再一个一个接口的示例了,我直接把自己封装好的一个微信接口类展示一下,可以直接套用。后续会不断完善。 1