关于微信卡券预览接口

最近在做微信卡券接口相关的功能,,妈耶,相当于复制一个微信公众平台的卡券模块!光字段就能反4屏,简直就是惩罚性编程,搞的我很焦虑。。花了两周的时间,终于仿照微信原版在自己后台完成了创建卡券的功能,,当在微信公众平台看到新创建的折扣券,长舒一口气,终于看见了正反馈!!接下来,,得预览下吧?不能直接投放呀。OK,预览接口,,今天的主角儿。要知道,卡券预览接口做的很顺利的话,也就没这篇文章了。。


OK,进入正题儿。

创建完卡券之后,我们按照逻辑,可以应该继续往下进行,在文档中可以找到管理卡券的模块。直接在这个页面搜索关键字『预览接口』,,即👇

###4.6 预览接口
支持开发者调用该接口下发卡券。订阅号不可用,服务号认证后可用。详情见

预览接口

按理儿说,这就成了呀,,照预览接口做就得了呗。但是!!!点开预览接口,我们看到的是啥?丫丫,空的,空页面,啥玩意儿没有?!🙃
(问候一下微信写文档的同学)

冷静一下,,既然做了链接,这说明极有可能在别的模块中,否则就没必要做链接了对吧;另外,预览接口,那得把消息推送到手机上呀,事件推送,消息管理?~那找吧,,
loding..

诶!还真在消息管理群发接口和原创校验模块中给找着了!

预览接口【订阅号与服务号认证后均可用】

文档有了,nèng!

卡券:

1
2
3
4
5
6
7
8
9
{"touser": "OPENID", 
"wxcard": {
"card_id": "123dsdajkasd231jhksad",
"card_ext": "{"code": "","openid": "","timestamp": "1402057159","signature": "017bb17407c8e0058a66d72dcc61632b70f511ad"}"
},
"msgtype": "wxcard"
}

// 请注意,上述JSON数据中的touser字段都可以改为towxname,这样就可以针对微信号进行预览(而非openID),towxname和touser同时赋值时,以towxname优先。

参数说明就不放了,文档中有说明,,但是这个card_ext什么鬼?!!没听说过呀都,忒眼生。。另外,这个字段里,别的参数还好说。但,,signature是怎么计算出来的?这是关键呀。得,这真难倒我了,而且这页面中只有这一个地方出现了这一属性。搁哪儿找呀,,百度先行,关键字[微信 卡券 card_ext]

顺藤摸瓜,找到了微信网页开发模块中的微信JS-SDK说明文档看上去怎么那么不靠谱?消息推送跟网页开发有嘛关系?!!但在这个页面中还真就找到了card_ext字段,,👇

附录4-卡券扩展字段及签名生成算法

卡券 api_ticket
卡券扩展字段cardExt说明
签名说明

剩下的一切按文档来就成了,,需要注意的是👇

######签名说明
1.将 api_ticket、timestamp、card_id、code、openid、nonce_str的value值进行字符串的字典序排序。

这个字典序排序,第一次看见还真有点懵,,但好在通过搜索引擎可以解决~我参考了这篇博客,,TreeMap按照value进行排序实现代码如下👇

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Map<String, String> wxMap = new TreeMap<String, String>();
//参数封装
wxMap.put("api_ticket", wxJsApiTicket);
wxMap.put("timestamp", wxTimestamp);
wxMap.put("card_id", cardId);
wxMap.put("code", "");// 视实际情况
wxMap.put("openid", "");// 视实际情况
wxMap.put("noncestr", wxNoncestr);

// 将 api_ticket、timestamp、card_id、code、openid、nonce_str的value值进行字符串的字典序排序。
List<Entry<String, String>> list = new ArrayList<Entry<String, String>>(wxMap.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
//升序排序
public int compare(Entry<String, String> o1, Entry<String, String> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});

// 将排序后的值依次取出,并拼接为字符串。
StringBuilder wxBaseString = new StringBuilder();
for (Entry<String, String> param : list) {
wxBaseString.append(param.getValue());
}
log.info(wxBaseString.toString());

// 加密获取signature
String wxSignature = HashKit.sha1(wxBaseString.toString());

这剩下的就是调用微信卡券预览接口了,自己来吧~


PS: 这昨儿个看了姜文儿的『邪不压正』,,本篇分享的风格就这样了,多包涵。哭笑

参考链接:

  1. 群发接口 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1481187827_i0l21
  2. 微信JS-SDK说明文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
  3. 字典序排序 http://www.cnblogs.com/Berryxiong/p/6240514.html
  4. debug https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=cardsign