浅析微信支付:公众平台卡券功能开通、HTML5线上发券(JS-SDK接口)、查看卡券详情 (3)

json参数:

{ "action_name":"QR_CARD", "expire_seconds":1800, "action_info":{ "card":{ "card_id":"pFS7Fjg8kV1IdDz01r4SQwMkuCKc", "code":"198374613512", "openid":"oFS7Fjl0WsZ9AMZqrI80nbIq8xrA", "is_unique_code":false, "outer_str":"12b" } } } 显示二维码

在上一步的返回中点击字段show_qrcode_url字段中的链接,即可显示卡券领取二维码。
打开微信扫一扫,然后领取卡劵,如果显示卡劵未通过审核,那么需要下一步设置测试白名单,如果可以领取就忽略第六步。

设置测试白名单

文档地址:

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025062 核销卡劵

文档地址:

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025239

注意事项:仅支持审核通过且在有效期内的卡劵

HTML5网页发券(JS-SDK)

上面通过二维码发券的方式,我觉得官方文档已经解释清楚了,且接口也比较简单,所以这里就不赘述,主要需要讲的是这里的 HTML5网页发券(JS-SDK),官方文档链接如下:

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025062

HTML5线上发券(JS-SDK接口)

看了上面的图,小伙伴大概知道是什么意思了吧,简单点说,就是用户在咋们系统H5中点击按钮,可以弹出微信官方的领取优惠券界面,官方的页面是微信提供的,我们无需开发,只需要关注如何调用官方的方法即可。

官方解释如下:微信提供的addCard接口供商户前端网页调用,用于将一张或多张卡券添加到用户卡包

接口地址如下(在以下页面搜索addCard即可直达):

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

批量添加卡券接口

上面是添加卡券的接口,我们重点关注这几个参数:

cardId:卡券ID,如果是商户平台,则是批次ID

cardExt:卡券的扩展参数。需进行 JSON 序列化为字符串传入

cardExt>openid:指定领取者的 openid,只有该用户能领取。 bind_openid 字段为 true 的卡券必须填写,bind_openid 字段为 false 不可填写。

cardExt>code:用户领取的 code,仅自定义 code 模式的卡券须填写,非自定义 code 模式卡券不可填写

cardExt>nonce_str:随机字符串,由开发者设置传入,加强安全性(若不填写可能被重放请求)。随机字符串,不长于 32 位。推荐使用大小写字母和数字,不同添加请求的 nonce_str 须动态生成,若重复将会导致领取失败。

cardExt>signature:签名,商户将接口列表中的参数按照指定方式进行签名,签名方式使用 SHA1,具体签名方案参见:卡券签名

cardExt>timestamp:时间戳,东八区时间,UTC+8,单位为秒

cardExt>outer_str:领取渠道参数,用于标识本次领取的渠道值。

cardExt>fixed_begintimestamp:卡券在第三方系统的实际领取时间,为东八区时间戳(UTC+8,精确到秒)。当卡券的有效期类为 DATE_TYPE_FIX_TERM 时专用,标识卡券的实际生效时间,用于解决商户系统内起始时间和领取微信卡券时间不同步的问题。

根据代金券批次ID得到组合的cardList

首先,获取cardList接口需要先获取access_token,再获取api_ticket,最后组装成想要的集合,下面是示例代码。

根据代金券批次ID得到组合的cardList:

/** * 根据代金券批次ID得到组合的cardList * * @param cardId 卡包ID * @return cardList * @author yclimb * @date 2018/9/21 */ public JSONArray getCardList(String cardId) { if (StringUtils.isBlank(cardId)) { return null; } try { // 获取[商户名称]公众号的 access_token String accessToken = this.getAccessToken(WXConstants.WX_MINI_PROGRAM_CODE); String timestamp = String.valueOf(WXPayUtil.getCurrentTimestamp()); String nonce_str = WXPayUtil.generateNonceStr(); // 卡券的扩展参数。需进行 JSON 序列化为字符串传入 JSONObject cardExt = new JSONObject(); //cardExt.put("code", ""); //cardExt.put("openid", ""); //cardExt.put("fixed_begintimestamp", ""); //cardExt.put("outer_str", ""); cardExt.put("timestamp", timestamp); cardExt.put("nonce_str", nonce_str); /** * 1.将 api_ticket、timestamp、card_id、code、openid、nonce_str的value值进行字符串的字典序排序。 * 2.将所有参数字符串拼接成一个字符串进行sha1加密,得到signature。 * 3.signature中的timestamp,nonce字段和card_ext中的timestamp,nonce_str字段必须保持一致。 */ Map<String, String> map = new HashMap<>(8); //map.put("code", ""); //map.put("openid", ""); map.put("api_ticket", this.getWxCardApiTicket(accessToken)); map.put("timestamp", timestamp); map.put("card_id", cardId); map.put("nonce_str", nonce_str); cardExt.put("signature", WXPayUtil.SHA1(WXPayUtil.dictionaryOrder(map, 2))); // 卡券对象 JSONObject cardInfo = new JSONObject(); cardInfo.put("cardId", cardId); cardInfo.put("cardExt", cardExt.toJSONString()); // 需要添加的卡券列表 JSONArray cardList = new JSONArray(1); cardList.add(cardInfo); return cardList; } catch (Exception e) { WXPayUtil.getLogger().error(e.getMessage(), e); } return null; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxwww.html