/*
准备:
1、公众号绑定小程序号;
2、注册一个开放平台,并将小程序和公众号绑定在同一个开放平台账号下;(文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1499332673_Unm7V)
3、官方卡券常见问题文档:https://developers.weixin.qq.com/community/develop/doc/000840ffeb0660526067be8ce5b408?highLine=%25E5%25B0%258F%25E7%25A8%258B%25E5%25BA%258F%25E5%258D%25A1%25E5%2588%25B8%25E7%25AD%25BE%25E5%2590%258D%25E9%2594%2599%25E8%25AF%25AF
4、官方卡券签名生成算法文档(见附录4-卡券扩展字段及签名生成算法):
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
*/
//小程序代码:
//index.wxml
<button bindtap="getCard">领卡</button>
//index.js
Page({
data: {},
getCard:function(){
var timestamp = (Date.parse(new Date()) / 1000).toString();
var cardId = "pp42H1eeHts9WQfQcFc6MRd-Srbw";//卡券id,在公众号卡券详情里获得
var nonce_str = Math.floor(Math.random() * 10) + "abc123";
var pushData = { timestamp: timestamp, cardId: cardId, nonce_str: nonce_str};
wx.request({
url: 'http://192.168.1.139:60005/wxMemberCard/CardSign',
data: pushData,
header: { 'content-type': 'application/json' },
success(res) {
var signature = res.data;
wx.addCard({
cardList: [
{
cardId: cardId,
cardExt: '{"nonce_str": "' + nonce_str + '", "timestamp": "' + timestamp + '", "signature":"' + signature + '"}'
}
],
success: function (res) {
console.log(res.cardList)
}
})
}
})
}
})
//后端代码:
public string CardSign()
{
var appid = "wx907acf15e7f59a23";//公众号的appid,不是小程序的
var secret = "2a951174350e17711f3c60245f8aa84t";//公众号的secret
var url = $"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}";
var result = new WebUtils().DoGet(url, null); //WebUtils类在附件
var access_token = JObject.Parse(result).GetValue("access_token").ToString();
url = $"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={access_token}&type=wx_card";
result = new WebUtils().DoGet(url, null);
var api_ticket = JObject.Parse(result).GetValue("ticket").ToString();
var cardId = Request.QueryString["cardId"];
var timestamp = Request.QueryString["timestamp"];
var nonce_str = Request.QueryString["nonce_str"];//微信文档说这个非必传,但不传的话会报签名错误
List<string> list = new List<string>() { api_ticket, timestamp, nonce_str, cardId };
list.Sort();//按字典排序,微信的卡券签名校验工具的排序是错的[2019-01-28]。
var signStr = string.Join("", list);
var sign = BitConverter.ToString(System.Security.Cryptography.SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(signStr))).Replace("-", "").ToLower();
return sign;
}