Foxtable(狐表)用户栏目专家坐堂 → 搞了大半年都没有解决的问题,微信卡券


  共有2652人关注过本帖树形打印复制链接

主题:搞了大半年都没有解决的问题,微信卡券

帅哥哟,离线,有人找我吗?
fubblyc
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
搞了大半年都没有解决的问题,微信卡券  发帖心情 Post By:2019/3/28 15:13:00 [只看该作者]

老师,微信JS-SDK扫一扫等接口都搞定了,
就是 微信卡券要另外的 

图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20190328151238.png
图片点击可在新窗口打开查看


图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20190328151243.png
图片点击可在新窗口打开查看


图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20190328151124.png
图片点击可在新窗口打开查看







 回到顶部
帅哥哟,离线,有人找我吗?
fubblyc
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2019/3/28 15:13:00 [只看该作者]

我代码是这样写:

图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20190328150723.png
图片点击可在新窗口打开查看

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}&timestamp={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()


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/3/28 15:30:00 [只看该作者]

认认真真看帮助文档啊,两种签名不同啊

 

附录1-JS-SDK使用权限签名算法

jsapi_ticket

生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时piao据。正常情况下,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:

{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}

获得jsapi_ticket之后,就可以生成JS-SDK权限验证的签名了。

签名算法

签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

即signature=sha1(string1)。 示例:

noncestr=Wm3WZYTPz0wzccnW
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg
timestamp=1414587457
url=http://mp.weixin.qq.com?params=value

步骤1. 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=http://mp.weixin.qq.com?params=value

步骤2. 对string1进行sha1签名,得到signature:

0f9de62fce790f9a083d5c99e95740ceb90c27ed

注意事项

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 是用于调用卡券相关接口的临时piao据,有效期为 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字符串,是商户为该张卡券分配的唯一性信息,包含以下字段:

字段 是否必填 是否参与签名 说明
code 指定的卡券code码,只能被领一次。自定义code模式的卡券必须填写,非自定义code和预存code模式的卡券不必填写。详情见: 是否自定义code码
openid 指定领取者的openid,只有该用户能领取。bind_openid字段为true的卡券必须填写,bind_openid字段为false不必填写。
timestamp 时间戳,商户生成从1970年1月1日00:00:00至今的秒数,即当前的时间,且最终需要转换为字符串形式;由商户生成后传入,不同添加请求的时间戳须动态生成,若重复将会导致领取失败!。
nonce_str 随机字符串,由开发者设置传入, 加强安全性(若不填写可能被重放请求) 。随机字符串,不长于32位。推荐使用大小写字母和数字,不同添加请求的nonce须动态生成,若重复将会导致领取失败。
fixed_begintimestamp 卡券在第三方系统的实际领取时间,为东八区时间戳(UTC+8,精确到秒)。当卡券的有效期类型为 DAT E_TYPE_FIX_TERM时专用,标识卡券的实际生效时间,用于解决商户系统内起始时间和领取时间不同步的问题。
outer_str 领取渠道参数,用于标识本次领取的渠道值。
signature - 签名,商户将接口列表中的参数按照指定方式进行签名,签名方式使用SHA1,具体签名方案参见下文;由商户按照规范签名后传入。

签名说明

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。


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2019/3/28 15:45:00 [只看该作者]

恩恩,甜老师,先问你这个。。。JS的怎么和网页一致呢?

图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20190328153703.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20190328153639.png
图片点击可在新窗口打开查看


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/3/28 15:56:00 [只看该作者]

你的js不能写死啊,动态生成你的js内容,类似这种啊

 

wb.AppendHTML("<script>" & CExp(cfg,appid,timestamp,noncestr,signature) & "</script>",True)

 


 回到顶部
帅哥哟,离线,有人找我吗?
fubblyc
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2019/3/28 16:19:00 [只看该作者]

嗯嗯嗯,甜老师,我用  openCard  这个可以成功打开卡券。现在就是你说的要动态写。动态要怎么写呢。。。一点头绪没有。。。
JS要怎么写,HTM要怎么写呢。。。


JS:
wx.openCard({
cardList: [{
cardId: 'pPYXKt6Wj76w484UuwiVu5M1d068',
code: '567203355666R'
}]// 需要打开的卡券列表

htm:

图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20190328161905.png
图片点击可在新窗口打开查看




 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/3/28 16:40:00 [只看该作者]

你js里面的代码,动态生成,然后插入

 

wb.insertHTML("<script>js代码</script>")

[此贴子已经被作者于2019/3/28 16:41:31编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
fubblyc
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2019/3/28 16:51:00 [只看该作者]

甜老师,

wx.openCard({
cardList: [{
cardId: 'pPYXKt6Wj76w484UuwiVu5M1d068',
code: '567203355666R'
}]// 需要打开的卡券列表

这个要怎么合成呢。。。
这种是不是json结构的。。。

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/3/28 16:56:00 [只看该作者]

直接写,比如

 

wb.insertHTML("<script>wx.openCard({cardList: [{cardId: 'pPYXKt6Wj76w484UuwiVu5M1d068',code: '567203355666R'}]</script>")

 

或者换一种思路,你读取js文件进来,然后替换js里面的某一些字符为变量后,用得到的字符用insertHTML插入到你的网页去


 回到顶部
总数 14 1 2 下一页