当前位置:   article > 正文

H5公众号跳转小程序 wx-open-launch-weapp_微信公众号跳转到小程序

微信公众号跳转到小程序

最近工作中遇见需要实现公众号跳转小程序的功能

另外附加进微信公众号官网说明【目录 | 微信开放文档

一、引入JS文件

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

如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.6.0.js (支持https)

https://res.wx.qq.com/open/js/jweixin-1.6.0.js

<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
二、页面
  1. <div>
  2. <wx-open-launch-weapp id="launch-btn"
  3. appid="wx xxxxxxxx"
  4. username="gh_xxxxxxxx"
  5. path="pages/home/index?user=123&action=abc"
  6. >
  7. // appid 是所需跳转的小程序appid,即小程序对应的以wx开头的id
  8. // username 是所需跳转的小程序原始id,即小程序对应的以gh_开头的id
  9. // 跳转时,有 appid 会优先使用appid,没有 appid 才会使用username
  10. <template>
  11. <style>
  12. .btn {
  13. padding: 12px
  14. }
  15. </style>
  16. <button class="btn">打开小程序</button>
  17. </template>
  18. </wx-open-launch-weapp>
  19. </div>
  20. <script>
  21. var btn = document.getElementById('launch-btn');
  22. btn.addEventListener('launch', function (e) {
  23. //alert('success');
  24. });
  25. btn.addEventListener('error', function (e) {
  26. //alert('fail', e.detail);
  27. });
  28. </script>
三、通过config接口注入权限验证配置并申请所需开放标签
  1. wx.config({
  2. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  3. appId: "", // 必填,公众号的唯一标识
  4. timestamp: "", // 必填,生成签名的时间戳
  5. nonceStr: "", // 必填,生成签名的随机串
  6. signature: "", // 必填,签名
  7. jsApiList: [
  8. "onMenuShareTimeline",
  9. "onMenuShareAppMessage",
  10. "checkJsApi",
  11. "scanQRCode"
  12. ], // 必填,需要使用的JS接口列表
  13. openTagList: ['wx-open-launch-weapp'], // 可选,需要使用的开放标签列表,例如['wx-open-launch-weapp','wx-open-launch-app']
  14. });
  15. wx.ready(function () {
  16. //config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中
  17. });
  18. wx.error(function (res) {
  19. //console.log('res', res);
  20. // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
  21. });

四、下面是获取公众号相关参数的共用类

  1. using Common;
  2. using LitJson;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Net;
  7. using System.Net.Security;
  8. using System.Security.Cryptography;
  9. using System.Security.Cryptography.X509Certificates;
  10. using System.Text;
  11. namespace IntelligentPhyExamGuid_WeChat.Model
  12. {
  13. /// <summary>
  14. /// 微信请求体
  15. /// </summary>
  16. public class WxPayDataParamIn
  17. {
  18. public static string jsapi_ticket = String.Empty;
  19. public static DateTime access_token_Date = Convert.ToDateTime("1900-01-01");
  20. public static int expires_in = 7000;
  21. /// <summary>
  22. /// openid用于调用统一下单接口
  23. /// </summary>
  24. public string Openid { get; set; }
  25. /// <summary>
  26. /// access_token用于获取收货地址js函数入口参数
  27. /// </summary>
  28. public string Access_token { get; set; }
  29. //采用排序的Dictionary的好处是方便对数据包进行签名,不用再签名之前再做一次排序
  30. private SortedDictionary<string, object> m_values = new SortedDictionary<string, object>();
  31. /**
  32. * 设置某个字段的值
  33. * @param key 字段名
  34. * @param value 字段值
  35. */
  36. public void SetValue(string key, object value)
  37. {
  38. m_values[key] = value;
  39. }
  40. /**
  41. * 根据字段名获取某个字段的值
  42. * @param key 字段名
  43. * @return key对应的字段值
  44. */
  45. public object GetValue(string key)
  46. {
  47. object o = null;
  48. m_values.TryGetValue(key, out o);
  49. return o;
  50. }
  51. public string GetOpenidAndAccessTokenFromCode(string code)
  52. {
  53. try
  54. {
  55. //构造获取openid及access_token的url
  56. WxPayDataParamIn data = new WxPayDataParamIn();
  57. data.SetValue("appid", System.Configuration.ConfigurationManager.AppSettings["WeixinAppId"]);
  58. data.SetValue("secret", System.Configuration.ConfigurationManager.AppSettings["WeixinAppSecret"]);
  59. data.SetValue("code", code);
  60. data.SetValue("grant_type", "authorization_code");
  61. string url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + data.ToUrl();
  62. //请求url以获取数据
  63. string result = Get(url);
  64. LogHelper.AddErrorLog("3 result==>" + result);
  65. //保存access_token,用于收货地址获取
  66. JsonData jd = JsonMapper.ToObject(result);
  67. Access_token = (string)jd["access_token"];
  68. //获取用户openid
  69. Openid = (string)jd["openid"];
  70. SessionHelper.OpenId = Openid;
  71. LogHelper.AddErrorLog("4 openid==>" + Openid + " access_token==>" + Access_token);
  72. string wechatUrl = SessionHelper.RedirectUrl;
  73. if (wechatUrl.Contains("?"))
  74. {
  75. wechatUrl += "&openid=" + Openid;
  76. }
  77. else
  78. {
  79. wechatUrl += "?openid=" + Openid;
  80. }
  81. LogHelper.AddErrorLog("wechatUrl==>" + wechatUrl);
  82. return wechatUrl;
  83. }
  84. catch (Exception ex)
  85. {
  86. return "";
  87. }
  88. }
  89. /**
  90. * @Dictionary格式转化成url参数格式
  91. * @ return url格式串, 该串不包含sign字段值
  92. */
  93. public string ToUrl()
  94. {
  95. string buff = "";
  96. foreach (KeyValuePair<string, object> pair in m_values)
  97. {
  98. if (pair.Value == null)
  99. {
  100. LogHelper.AddErrorLog("WxPayData内部含有值为null的字段!" + pair.Key);
  101. return "";
  102. }
  103. if (pair.Key != "sign" && pair.Value.ToString() != "")
  104. {
  105. buff += pair.Key + "=" + pair.Value + "&";
  106. }
  107. }
  108. buff = buff.Trim('&');
  109. return buff;
  110. }
  111. public static string Get(string url)
  112. {
  113. System.GC.Collect();
  114. string result = "";
  115. HttpWebRequest request = null;
  116. HttpWebResponse response = null;
  117. //请求url以获取数据
  118. try
  119. {
  120. //设置最大连接数
  121. ServicePointManager.DefaultConnectionLimit = 200;
  122. //设置https验证方式
  123. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  124. {
  125. ServicePointManager.ServerCertificateValidationCallback =
  126. new RemoteCertificateValidationCallback(CheckValidationResult);
  127. }
  128. /***************************************************************
  129. * 下面设置HttpWebRequest的相关属性
  130. * ************************************************************/
  131. request = (HttpWebRequest)WebRequest.Create(url);
  132. request.Method = "GET";
  133. //设置代理
  134. //WebProxy proxy = new WebProxy();
  135. //proxy.Address = new Uri(WxPayConfig.PROXY_URL);
  136. //request.Proxy = proxy;
  137. //获取服务器返回
  138. response = (HttpWebResponse)request.GetResponse();
  139. //获取HTTP返回数据
  140. StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  141. result = sr.ReadToEnd().Trim();
  142. sr.Close();
  143. }
  144. catch (System.Threading.ThreadAbortException e)
  145. {
  146. LogHelper.AddErrorLog("Thread - caught ThreadAbortException - resetting.");
  147. LogHelper.AddErrorLog(e.Message);
  148. System.Threading.Thread.ResetAbort();
  149. }
  150. catch (WebException e)
  151. {
  152. LogHelper.AddErrorLog(e.ToString());
  153. if (e.Status == WebExceptionStatus.ProtocolError)
  154. {
  155. LogHelper.AddErrorLog("StatusCode : " + ((HttpWebResponse)e.Response).StatusCode);
  156. LogHelper.AddErrorLog("StatusDescription : " + ((HttpWebResponse)e.Response).StatusDescription);
  157. }
  158. return "";
  159. }
  160. catch (Exception e)
  161. {
  162. LogHelper.AddErrorLog(e.ToString());
  163. return "";
  164. }
  165. finally
  166. {
  167. //关闭连接和流
  168. if (response != null)
  169. {
  170. response.Close();
  171. }
  172. if (request != null)
  173. {
  174. request.Abort();
  175. }
  176. }
  177. return result;
  178. }
  179. /**
  180. * 生成随机串,随机串包含字母或数字
  181. * @return 随机串
  182. */
  183. public static string GenerateNonceStr()
  184. {
  185. return Guid.NewGuid().ToString().Replace("-", "");
  186. }
  187. /// <summary>
  188. /// 获取jsapi_ticket
  189. /// </summary>
  190. /// <param name="access_token"></param>
  191. /// <returns>ticket</returns>
  192. public static string Getjsapi_ticket(string access_token)
  193. {
  194. var timespan = (DateTime.Now - access_token_Date);//获取时间差(秒)
  195. if (timespan.TotalSeconds < expires_in && !string.IsNullOrEmpty(jsapi_ticket))
  196. {
  197. return jsapi_ticket;
  198. }
  199. else
  200. {
  201. string ticket = "";
  202. string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi";
  203. string response = Get(url);
  204. JsonData jd = JsonMapper.ToObject(response);
  205. ticket = (string)jd["ticket"];
  206. jsapi_ticket = ticket;
  207. access_token_Date = DateTime.Now;
  208. return ticket;
  209. }
  210. }
  211. /**
  212. * 生成时间戳,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数
  213. * @return 时间戳
  214. */
  215. public static string GenerateTimeStamp()
  216. {
  217. TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
  218. return Convert.ToInt64(ts.TotalSeconds).ToString();
  219. }
  220. /**
  221. * @生成js验证签名,详见签名生成算法
  222. * @return 签名, sign字段不参加签名
  223. */
  224. public string MakeSign2()
  225. {
  226. //转url格式
  227. string str = ToUrl();
  228. var sha1 = SHA1.Create();
  229. var bs = sha1.ComputeHash(Encoding.UTF8.GetBytes(str));
  230. var signature = new StringBuilder();
  231. foreach (byte b in bs)
  232. {
  233. signature.Append(b.ToString("x2"));
  234. }
  235. //所有字符转为大写
  236. return signature.ToString();
  237. }
  238. public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
  239. {
  240. //直接确认,否则打不开
  241. return true;
  242. }
  243. }
  244. }
五、使用微信共用类生成参数
  1. string jsapi_ticket = WxPayDataParamIn.Getjsapi_ticket(access_token);
  2. string noncestr = WxPayDataParamIn.GenerateNonceStr();
  3. string timestamp = WxPayDataParamIn.GenerateTimeStamp();
  4. string url2 = "";//当前地址;
  5. WxPayDataParamIn WxData = new WxPayDataParamIn();
  6. WxData.SetValue("jsapi_ticket", jsapi_ticket);
  7. WxData.SetValue("noncestr", noncestr);
  8. WxData.SetValue("timestamp", timestamp);
  9. WxData.SetValue("url", url2);
  10. string signature = WxData.MakeSign2();
  11. string pcode = ConfigurationManager.AppSettings["POIpcode"];//POI地图导航项目编码
  12. ViewBag.JumpAppleturl = $"/pages/index/index?pcode={pcode}&to={par}";//跳转小程序URL
  13. ViewBag.WeixinAppid = ConfigurationManager.AppSettings["WeixinAppId"];//微信公众号的appid
  14. ViewBag.POIAppid = ConfigurationManager.AppSettings["POIAppId"];//POI地图导航小程序appId
  15. ViewBag.Signature = signature;
  16. ViewBag.Timestamp = timestamp;
  17. ViewBag.Noncestr = noncestr;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/804488
推荐阅读
相关标签
  

闽ICP备14008679号