以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 搞了大半年都没有解决的问题,微信卡券 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=132729) |
||||||||||||||||||||||||||||||||
-- 作者:fubblyc -- 发布时间:2019/3/28 15:13:00 -- 搞了大半年都没有解决的问题,微信卡券 老师,微信JS-SDK扫一扫等接口都搞定了, 就是 微信卡券要另外的 |
||||||||||||||||||||||||||||||||
-- 作者:fubblyc -- 发布时间:2019/3/28 15:13:00 -- 我代码是这样写: Static CreateTime As Date \'记录最近一次生成Ticket 的时间 Static Ticket As String \'记录最近一次生成的Ticket Dim tp As TimeSpan = Date.Now - CreateTime \'Dim ul As String = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi" Dim ul As String = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=wx_card" If tp.TotalSeconds > 3600 Then Dim hc As New HttpClient(CExp(ul,Functions.Execute("GetAccessToken","泉有限公司"))) Dim ret As String = hc.GetData() If ret = "" Then \'如果失败,再尝试一次 hc.GetData() End If CreateTime = Date.Now() Dim jo As JObject = JObject.Parse(ret) If jo("errcode") = "0" Then Ticket = jo("ticket") \'Else \'MessageBox.show("获取jsapi_ticket,原因:" & vbcrlf & jo.ToString) End If End If \'Dim signature As String = CExp("api_ticket={0}&noncestr={1}×tamp={2}&card_id={3}&code={4}",Ticket,args(0),args(1),args(2),args(3)) Dim signature As String = CExp("timestamp={0}&api_ticket={1}&code={2}&noncestr={3}&card_id={4}",args(0),Ticket,args(1),args(2),args(3)) PopMessage("Ticket2:" & Ticket) Return Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(signature, "SHA1").ToLower() |
||||||||||||||||||||||||||||||||
-- 作者:有点甜 -- 发布时间:2019/3/28 15:30:00 -- 认认真真看帮助文档啊,两种签名不同啊
附录1-JS-SDK使用权限签名算法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 成功返回如下JSON:
获得jsapi_ticket之后,就可以生成JS-SDK权限验证的签名了。 签名算法 签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。 即signature=sha1(string1)。 示例:
步骤1. 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:
步骤2. 对string1进行sha1签名,得到signature:
注意事项 1.签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。 2.签名用的url必须是调用JS接口页面的完整URL。 3.出于安全考虑,开发者必须在服务器端实现签名的逻辑。 如出现invalid signature 等错误详见附录5常见错误及解决办法。
附录4-卡券扩展字段及签名生成算法JSSDK使用者请读这里,JSAPI用户可以跳过 卡券签名和JSSDK的签名完全独立,两者的算法和意义完全不同,请不要混淆。JSSDK的签名是使用所有JS接口都需要走的一层鉴权,用以标识调用者的身份,和卡券本身并无关系。其次,卡券的签名考虑到协议的扩展性和简单的防数据擅改,设计了一套独立的签名协议。另外由于历史原因,卡券的JS接口先于JSSDK出现,当时的JSAPI并没有鉴权体系,所以在卡券的签名里也加上了appsecret/api_ticket这些身份信息,希望开发者理解。 卡券 api_ticket 卡券 api_ticket 是用于调用卡券相关接口的临时票据,有效期为 7200 秒,通过 access_token 来获取。这里要注意与 jsapi_ticket 区分开来。由于获取卡券 api_ticket 的 api 调用次数非常有限,频繁刷新卡券 api_ticket 会导致 api 调用受限,影响自身业务,开发者必须在自己的服务全局缓存卡券 api_ticket 。 1.参考以下文档获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html 2.用第一步拿到的access_token 采用http GET方式请求获得卡券 api_ticket(有效期7200秒,开发者必须在自己的服务全局缓存卡券 api_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card 卡券扩展字段cardExt说明 cardExt本身是一个JSON字符串,是商户为该张卡券分配的唯一性信息,包含以下字段:
签名说明 1.将 api_ticket、timestamp、card_id、code、openid、nonce_str的value值进行字符串的字典序排序。 2.将所有参数字符串拼接成一个字符串进行sha1加密,得到signature。 3.signature中的timestamp,nonce字段和card_ext中的timestamp,nonce_str字段必须保持一致。 4.code=1434008071,timestamp=1404896688,card_id=pjZ8Yt1XGILfi-FUsewpnnolGgZk, api_ticket=ojZ8YtyVyr30HheH3CM73y7h4jJE ,nonce_str=123 则signature=sha1(12314048966881434008071ojZ8YtyVyr30HheH3CM73y7h4jJEpjZ8Yt1XGILfi-FUsewpnnolGgZk)=f137ab68b7f8112d20ee528ab6074564e2796250。 强烈建议开发者使用卡券资料包中的签名工具SDK进行签名或使用debug工具进行校验:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=cardsign 卡券签名cardSign说明 1.将 api_ticket、appid、location_id、timestamp、nonce_str、card_id、card_type的value值进行字符串的字典序排序。 2.将所有参数字符串拼接成一个字符串进行sha1加密,得到cardSign。 |
||||||||||||||||||||||||||||||||
-- 作者:有点甜 -- 发布时间:2019/3/28 15:39:00 -- 认认真真看这里,注意合成的字符串的顺序
code=1434008071,timestamp=1404896688,card_id=pjZ8Yt1XGILfi-FUsewpnnolGgZk, api_ticket=ojZ8YtyVyr30HheH3CM73y7h4jJE ,nonce_str=123 则signature=sha1(12314048966881434008071ojZ8YtyVyr30HheH3CM73y7h4jJEpjZ8Yt1XGILfi-FUsewpnnolGgZk)=f137ab68b7f8112d20ee528ab6074564e2796250。 强烈建议开发者使用卡券资料包中的签名工具SDK进行签名或使用debug工具进行校验:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=cardsign
至于排序生成签名,参考这里的代码
http://www.foxtable.com/mobilehelp/scr/0175.htm
|
||||||||||||||||||||||||||||||||
-- 作者:fubblyc -- 发布时间:2019/3/28 15:45:00 -- 恩恩,甜老师,先问你这个。。。JS的怎么和网页一致呢? |
||||||||||||||||||||||||||||||||
-- 作者:有点甜 -- 发布时间:2019/3/28 15:56:00 -- 你的js不能写死啊,动态生成你的js内容,类似这种啊
wb.AppendHTML("<script>" & CExp(cfg,appid,timestamp,noncestr,signature) & "</script>",True)
|
||||||||||||||||||||||||||||||||
-- 作者:fubblyc -- 发布时间:2019/3/28 16:19:00 -- 嗯嗯嗯,甜老师,我用 openCard 这个可以成功打开卡券。现在就是你说的要动态写。动态要怎么写呢。。。一点头绪没有。。。 JS要怎么写,HTM要怎么写呢。。。 JS: |
||||||||||||||||||||||||||||||||
-- 作者:有点甜 -- 发布时间:2019/3/28 16:40:00 -- 你js里面的代码,动态生成,然后插入
wb.insertHTML("<script>js代码</script>") [此贴子已经被作者于2019/3/28 16:41:31编辑过]
|
||||||||||||||||||||||||||||||||
-- 作者:fubblyc -- 发布时间:2019/3/28 16:51:00 -- 甜老师, wx.openCard({ cardList: [{ cardId: \'pPYXKt6Wj76w484UuwiVu5M1d068\', code: \'567203355666R\' }]// 需要打开的卡券列表 这个要怎么合成呢。。。 这种是不是json结构的。。。 |
||||||||||||||||||||||||||||||||
-- 作者:有点甜 -- 发布时间:2019/3/28 16:56:00 -- 直接写,比如
wb.insertHTML("<script>wx.openCard({cardList: [{cardId: \'pPYXKt6Wj76w484UuwiVu5M1d068\',code: \'567203355666R\'}]</script>")
或者换一种思路,你读取js文件进来,然后替换js里面的某一些字符为变量后,用得到的字符用insertHTML插入到你的网页去 |