Reference
微信官网文档
微信领取商家券API简介: https://pay.weixin.qq.com/wik...
后端
第三方集成服务
Github-WxJava: https://github.com/Wechat-Gro...
前端
小程序发券插件
官网小程序发券插件: https://pay.weixin.qq.com/wik...
uniapp 援用小程序发券插件的应用教训: https://ask.dcloud.net.cn/art...
后端
API: https://pay.weixin.qq.com/wik...
引入
pom.xml
<dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-pay</artifactId> <version>4.1.0</version></dependency>
application.yml
留神: wx.pay.mchKey 是微信领取apiv2的signkey, 加密的时候V2和V3的key都可能用到,详细情况看文档要求
wx: pay: appId: wxoinweoih3098340h #微信公众号或者小程序等的appid mchId: 1234456789 #微信领取商户号 certSerialNo: KOKLJB45BB45KB45OIBOB45OUBB45 #商户在微信公众平台申请服务号对应的APPID apiv3Key: kljbawerkuoin324ointoin34 #微信领取商户密钥V3秘钥Key mchKey: oeairbngonegnoINoijOIHNoino #微信领取商户密钥V2秘钥Key certificates: https://api.mch.weixin.qq.com/v3/certificates #微信获取平台证书列表地址 #微信对立下单的API地址,用于二维码领取 payScoreNotifyUrl: https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi callbackUrl: https://api.sampleabc.com/api/pay/callback/ #异步接管微信领取后果告诉的回调地址 subAppId: #服务商模式下的子商户公众账号ID subMchId: #服务商模式下的子商户号 privateKeyPath: D:/samplePathabc/apiclient_key.pem privateCertPath: D:/samplePathabc/apiclient_cert.pem # p12证书的地位,能够指定绝对路径,也能够指定类门路(以classpath:结尾) keyPath: D:/samplePathabc/apiclient_cert.p12
相干类
以下类能够在我的项目中找到,git clone下来后寻找即可,通过测试类能够晓得用法
接口: https://github.com/Wechat-Gro...
实现类: https://github.com/Wechat-Gro...
测试类: https://github.com/Wechat-Gro...
生成商家券
// 生成券@PostMapping(value = "/port/to/create")public String createCoupon(@RequestBody Map<String, String> body) throws Exception { String stockId = this.testCreateFavorStocksV3(); return stockId;}// 生成商户券public String testCreateFavorStocksV3() throws WxPayException { BusiFavorStocksCreateRequest request = new BusiFavorStocksCreateRequest(); request.setStockName("这就是商家券666"); request.setBelongMerchant(wxPayService.getConfig().getMchId()); request.setComment("这就是评论了"); request.setGoodsName("仅供leonard应用"); request.setCouponCodeMode("WECHATPAY_MODE"); request.setOutRequestNo(wxPayService.getConfig().getMchId() + "20210204" + "1024102410"); //核销规定 CouponUseRule couponUseRule = new CouponUseRule(); //线下核销 couponUseRule.setUseMethod("OFF_LINE"); // 小程序核销 // couponUseRule.setUseMethod("MINI_PROGRAMS"); // couponUseRule.setMiniProgramsAppid("小程序APPID"); //couponUseRule.setMiniProgramsPath("/pages/index/index/abc.html?sadf=xxx"); //券可核销工夫 CouponAvailableTime couponAvailableTime = new CouponAvailableTime(); couponAvailableTime.setAvailableBeginTime("2021-10-22T13:29:35+08:00"); couponAvailableTime.setAvailableEndTime("2021-10-29T13:29:35+08:00"); couponUseRule.setCouponAvailableTime(couponAvailableTime); //固定面额满减券 request.setStockType(StockTypeEnum.NORMAL); FixedNormalCoupon fixedNormalCoupon = new FixedNormalCoupon(); fixedNormalCoupon.setDiscountAmount(31600); fixedNormalCoupon.setTransactionMinimum(98400); couponUseRule.setFixedNormalCoupon(fixedNormalCoupon); request.setCouponUseRule(couponUseRule); //发放规定 StockSendRule stockSendRule = new StockSendRule(); stockSendRule.setMaxCoupons(108); stockSendRule.setMaxCouponsPerUser(5); request.setStockSendRule(stockSendRule); BusiFavorStocksCreateResult result = wxPayService.getMarketingBusiFavorService().createBusiFavorStocksV3(request); String stockId = result.getStockId(); System.out.println("stockId: [{}]" + stockId); return stockId;}
查问商家券详情
// 获取券详情@PostMapping(value = "/port/to/get")public AjaxResult getCouponDetails(@RequestBody Map<String, String> body) throws Exception { String stockId = body.get("stockId"); BusiFavorStocksGetResult result = this.testGetBusiFavorStocksV3(stockId); return AjaxResult.success(result);}// 获取商家券详细信息public BusiFavorStocksGetResult testGetBusiFavorStocksV3(String stockId) throws WxPayException { BusiFavorStocksGetResult result = wxPayService.getMarketingBusiFavorService().getBusiFavorStocksV3(stockId); System.out.println(result); return result;}
生成小程序版本 发商户券 申请所需参数
@Resourceprivate WxPayService wxPayService;// 生成小程序版本 发商户券 申请所需参数@GetMapping(value = "/get/coupon/params/{stockId}")public Map<String, String> generateCouponParams(@PathVariable("stockId") String stockId) throws Exception { Coupon coupon = couponMapper.selectCouponByStockId(stockId); BusiFavorCouponsUrlRequest request = new BusiFavorCouponsUrlRequest(); request.setOutRequestNo(coupon.getOutRequestNo); request.setSendCouponMerchant(this.wxPayService.getConfig().getMchKey()); request.setStockId(stockId); // 签名 String sign = this.buildBusiFavorCouponinfoMiniapp(request); Map<String, String> result = new HashMap<>(); result.put("stock_id", stockId); result.put("out_request_no", request.getOutRequestNo()); result.put("sign", request.getSign()); result.put("send_coupon_merchant", request.getSendCouponMerchant()); return result;}// 签名public String buildBusiFavorCouponinfoMiniapp(BusiFavorCouponsUrlRequest request) throws WxPayException { // 官网签名拼接要求(留神out_request_no0和stock_id0字段最初有0,即便是1张券) // out_request_no0=abc123&send_coupon_merchant=10016226&stock_id0=1234567&key=xxxxx Map<String, String> signMap = new HashMap<>(8); signMap.put("out_request_no0", request.getOutRequestNo()); signMap.put("send_coupon_merchant", request.getSendCouponMerchant()); signMap.put("stock_id0", request.getStockId()); String sign = SignUtils.createSign(signMap, WxPayConstants.SignType.HMAC_SHA256, this.wxPayService.getConfig().getMchKey(), null); return sign;}
前端
引入
step 1:
在 manifest.json 中点击源码视图, 在 mp-weixin 里增加:
"plugins": { "sendCoupon": { "version": "latest", "provider": "wxf3f436ba9bd4be7b" } }
step2:
在 pages.json 的 globalStyle 里增加
"usingComponents": { "send-coupon": "plugin://sendCoupon/send-coupon" }
step3:
在须要调用插件的页面中调用, 依照微信的对接文档对接即可. 惟一须要留神的是, 发券的事件bindcustomevent改为 @customevent
<template> <send-coupon @customevent="couponCallback" :send_coupon_params="send_coupon_params" :sign="sign" :send_coupon_merchant="send_coupon_merchant"> <view>支付</view> </send-coupon> </template><script> export default { data() { return { send_coupon_params: [{ stock_id: "", out_request_no: "", }], sign: '', send_coupon_merchant: '' } }, methods: { async init() { const res = this.$http.get('/get/coupon/params/' + stockId); this.send_coupon_params = [{ stock_id: res.data.stock_id, out_request_no: res.data.out_request_no }]; this.sign = res.data.sign; this.send_coupon_merchant = res.data.send_coupon_merchant; } couponCallback(e) { // 外部有coupon_code等信息 console.log(e); }, onLoad() { this.init(); } } }</script>