本文是【浅析微信支付】系列文章的第十四篇,主要讲解在如何开通商户平台的代金券或立减优惠功能,商家向指定用户发送代金券,查询发送记录,代金券信息等。php
浅析微信支付系列已经更新十四篇了哟~,没有看过的朋友们能够看一下哦。git
浅析微信支付:商户平台开通现金红包、指定用户发放、红包记录查询github
浅析微信支付:(余额提现)企业付款到微信用户零钱或银行卡帐户算法
首先咱们须要了解一下什么是代金券和立减优惠?数组
代金券是微信支付为商家提供的一个营销工具,他的主要功能能够简单理解为商家的满减券,好比常见的“满十减一”、“满x减x”这类,须要用户主动领取或者平台主动为用户发放,核销时会在微信支付调起界面显示优惠券信息。微信
立减优惠是微信支付为商家提供的另外一种自主核销优惠,为什么叫自主核销?由于此优惠是一个门槛,不须要用户领取,商家设置一个用户群里,好比全员优惠“满十减一”,那么全部人均可以享受这个优惠,直接在购买商品时自动扣减金额。app
以上为简单的解释,下面我会结合官方文档来解释这两个优惠方式。工具
微信支付代金券业务是基于微信支付,为了协助商户方便地实现营销优惠措施。针对部分有开发能力的商户,微信支付提供经过API接口实现运营代金券的功能
官方文档地址:
https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_2&index=2
首先,这里咱们讲接口发放代金券的方式,下面是代金券的三个接口:
操做代金券开通和如何手动建立的官方文档以下:
https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_7&index=3
这里说一下重点须要注意的地方,首先,代金券分为单品券和全场券,简单理解:
PS:经过高级接口发放的代金券不能插入卡包,而且用户是没有感知的,这是一个缺点,你们必定要记住。
微信支付的代金券核销时都是在微信的确认支付窗口,若是有多个代金券,能够选择或者合并代金券支付,支付后在支付通知中会显示记录代金券使用的记录。
还须要注意一点,单品代金券核销时须要验证商品ID,这个商品ID在预支付单
中单品优惠活动detail字段
传入,json格式必填参数,字段中goods_id
就是咱们在商户后台建立代金券时填入的商品ID,具体的代码能够看个人统一下单接口
文章和GitHub源码。
show me the code:
/** * [单品优惠券] - 根据订单VO拼接统一下单须要的 detail 参数,此参数用于[单品优惠券]时自动抵扣 <br> * 统一下单API(支持单品优惠参数) - 享受了单品优惠的订单不支持部分退款,对帐单与普通支付保持一致 <br> * 接口地址:https://pay.weixin.qq.com/wiki/doc/api/danpin.php?chapter=9_102&index=2 * @param orderList 订单list * @return 微信支付统一下单 detail 参数 * * @author yclimb * @date 2018/9/14 */ public JSONObject setWxPayUnifiedOrderDetail(List<Order> orderList) { if (orderList == null || orderList.isEmpty()) { return null; } // 单品优惠活动detail字段列表说明: JSONObject detail = new JSONObject(); /* 订单原价 cost_price 否 int 608800 1.商户侧一张小票订单可能被分屡次支付,订单原价用于记录整张小票的交易金额。 2.当订单原价与支付金额不相等,则不享受优惠。 3.该字段主要用于防止同一张小票分屡次支付,以享受屡次优惠的状况,正常支付订单没必要上传此参数。*/ // detail.put("cost_price", createTradeVo.getTrade().getTotalPayMoney()); // 商品小票ID receipt_id 否 String(32) wx123 商家小票ID // detail.put("receipt_id", ""); // 单品优惠活动goods_detail字段说明: JSONArray goodsDetailList = new JSONArray(); for (Order order : orderList) { JSONObject goodsDetail = new JSONObject(); // 商品编码 goods_id 是 String(32) 商品编码 由半角的大小写字母、数字、中划线、下划线中的一种或几种组成 goodsDetail.put("goods_id", order.getProductId()); // 微信侧商品编码 wxpay_goods_id 否 String(32) 1001 微信支付定义的统一商品编号(没有可不传) // goodsDetail.put("wxpay_goods_id", ""); // 商品名称 goods_name 否 String(256) iPhone6s 16G 商品的实际名称 goodsDetail.put("goods_name", order.getProductName()); // 商品数量 quantity 是 int 1 用户购买的数量 goodsDetail.put("quantity", order.getItemNum()); // 商品单价 price 是 int 528800 单位为:分。若是商户有优惠,需传输商户优惠后的单价(例如:用户对一笔100元的订单使用了商场发的纸质优惠券100-50,则活动商品的单价应为原单价-50) goodsDetail.put("price", NumberUtil.mul(order.getPayMoney(), 100)); // 加入单品优惠集合 goodsDetailList.add(goodsDetail); } // 单品列表 goods_detail 是 String 示例见下文 单品信息,使用Json数组格式提交 detail.put("goods_detail", goodsDetailList); return detail; }
https://api.mch.weixin.qq.com/mmpaymkttransfers/send_coupon
请求须要双向证书。
用于商户主动调用接口给用户发放代金券的场景,已作防小号处理,给小号发放代金券将返回错误码。
注意:经过接口发放的代金券不会进入微信卡包
接口很简单,须要代金券批次ID和用户openid,代金券批次ID在哪里?每一个代金券建立后就会有一个代金券批次ID,在商户平台-营销管理-代金券管理中能够看到。
下面为调用方式:
// 微信支付对象 WXPay wxPay = new WXPay(WXPayConfigImpl.getInstance()); // 调用发送代金券接口 Map<String, String> resultMap = wxPay.sendCoupon(coupon_stock_id, partner_trade_no, openid);
微信接口调用:
/** * 做用:商户平台-代金券或立减优惠-发放代金券<br> * 场景:用于商户主动调用接口给用户发放代金券的场景,已作防小号处理,给小号发放代金券将返回错误码。 * 注意:经过接口发放的代金券不会进入微信卡包 * 接口文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_3&index=4 * * @param coupon_stock_id 代金券批次id * @param partner_trade_no 商户单据号 * @param openid 用户openid * @return API返回数据 * @throws Exception e * * @author yclimb * @date 2018/9/14 */ public Map<String, String> sendCoupon(String coupon_stock_id, String partner_trade_no, String openid) throws Exception { /** 构造请求参数数据 **/ Map<String, String> data = new HashMap<>(); // 代金券批次id coupon_stock_id 是 1757 String 代金券批次id data.put("coupon_stock_id", coupon_stock_id); // openid记录数 openid_count 是 1 int openid记录数(目前支持num=1) data.put("openid_count", "1"); // 商户单据号 partner_trade_no 是 1000009820141203515766 String 商户这次发放凭据号(格式:商户id+日期+流水号),商户侧需保持惟一性 data.put("partner_trade_no", partner_trade_no); // 用户openid openid 是 onqOjjrXT-776SpHnfexGm1_P7iE String Openid信息,用户在appid下的惟一标识 data.put("openid", openid); /** 如下参数为非必填参数 **/ // 操做员 op_user_id 否 10000098 String(32) 操做员账号, 默认为商户号 可在商户平台配置操做员对应的api权限 // 设备号 device_info 否 String(32) 微信支付分配的终端设备号 // 协议版本 version 否 1.0 String(32) 默认1.0 // 协议类型 type 否 XML String(32) XML【目前仅支持默认XML】 /** 如下四个参数,在 this.fillRequestData 方法中会自动赋值 **/ // 公众帐号ID appid 是 wx5edab3bdfba3dc1c String(32) 微信为发券方商户分配的公众帐号ID,接口传入的全部appid应该为公众号的appid(在mp.weixin.qq.com申请的),不能为APP的appid(在open.weixin.qq.com申请的)。 // 商户号 mch_id 是 10000098 String(32) 微信为发券方商户分配的商户号 // 随机字符串 nonce_str 是 1417574675 String(32) 随机字符串,不长于32位 // 签名 sign 是 841B3002FE2220C87A2D08ABD8A8F791 String(32) 签名参数,详见签名生成算法 // 微信调用接口 Map<String, String> resultMap = this.sendCoupon(data); WXPayUtil.getLogger().info("wxPay.sendCoupon:" + resultMap); return resultMap; }
以上为发放代金券相关代码,下面是查询代金券批次和代金券领取记录接口。 解释下什么叫作代金券批次和代金券记录:
官方文档以下:
https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_4&index=5
是否须要证书:否
请求参数主要为代金券批次idcoupon_stock_id
,下面是调用接口代码:
/** * 做用:商户平台-代金券或立减优惠-查询代金券批次<br> * 场景:查询代金券批次信息 * 接口文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_4&index=5 * * @param coupon_stock_id 代金券批次id * @return API返回数据 * @throws Exception e * * @author yclimb * @date 2018/9/14 */ public Map<String, String> queryCouponStock(String coupon_stock_id) throws Exception { /** 构造请求参数数据 **/ Map<String, String> data = new HashMap<>(); // 代金券批次id coupon_stock_id 是 1757 String 代金券批次id data.put("coupon_stock_id", coupon_stock_id); /** 如下参数为非必填参数 **/ // 操做员 op_user_id 否 10000098 String(32) 操做员账号, 默认为商户号 可在商户平台配置操做员对应的api权限 // 设备号 device_info 否 String(32) 微信支付分配的终端设备号 // 协议版本 version 否 1.0 String(32) 默认1.0 // 协议类型 type 否 XML String(32) XML【目前仅支持默认XML】 /** 如下四个参数,在 this.fillRequestData 方法中会自动赋值 **/ // 公众帐号ID appid 是 wx5edab3bdfba3dc1c String(32) 微信为发券方商户分配的公众帐号ID,接口传入的全部appid应该为公众号的appid(在mp.weixin.qq.com申请的),不能为APP的appid(在open.weixin.qq.com申请的)。 // 商户号 mch_id 是 10000098 String(32) 微信为发券方商户分配的商户号 // 随机字符串 nonce_str 是 1417574675 String(32) 随机字符串,不长于32位 // 签名 sign 是 841B3002FE2220C87A2D08ABD8A8F791 String(32) 签名参数,详见签名生成算法 // 微信调用接口 Map<String, String> resultMap = this.queryCouponStock(data); WXPayUtil.getLogger().info("wxPay.queryCouponStock:" + resultMap); return resultMap; }
此接口主要用于在商家系统主动查询代金券时使用,若是须要实时同步领券数量等,须要定时任务来同步;推荐作法,若是商家自身系统已经发券,就不要使用微信商户平台的发券方式,自身系统发券便可;或者能够作一个手动同步的口子,某一个时间点手动触发同步机制。
官方文档以下:
https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_5&index=6
此接口主要做用是查询某个用户的领券状态,代金券状态。 须要三个主要参数:coupon_id
代金券id、stock_id
批次号、openid
用户openid。
调用接口代码以下:
/** * 做用:商户平台-代金券或立减优惠-查询代金券信息<br> * 场景:查询代金券信息 * 接口文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_5&index=6 * * @param coupon_id 代金券id * @param stock_id 批次号 * @param openid 用户openid * @return API返回数据 * @throws Exception e * * @author yclimb * @date 2018/9/14 */ public Map<String, String> queryCouponsInfo(String coupon_id, String stock_id, String openid) throws Exception { /** 构造请求参数数据 **/ Map<String, String> data = new HashMap<>(); // 代金券id coupon_id 是 1565 String 代金券id data.put("coupon_id", coupon_id); // 用户openid openid 是 onqOjjrXT-776SpHnfexGm1_P7iE String Openid信息,用户在appid下的惟一标识 data.put("openid", openid); // 批次号 stock_id 是 58818 String(32) 代金劵对应的批次号 data.put("stock_id", stock_id); /** 如下参数为非必填参数 **/ // 操做员 op_user_id 否 10000098 String(32) 操做员账号, 默认为商户号 可在商户平台配置操做员对应的api权限 // 设备号 device_info 否 String(32) 微信支付分配的终端设备号 // 协议版本 version 否 1.0 String(32) 默认1.0 // 协议类型 type 否 XML String(32) XML【目前仅支持默认XML】 /** 如下四个参数,在 this.fillRequestData 方法中会自动赋值 **/ // 公众帐号ID appid 是 wx5edab3bdfba3dc1c String(32) 微信为发券方商户分配的公众帐号ID,接口传入的全部appid应该为公众号的appid(在mp.weixin.qq.com申请的),不能为APP的appid(在open.weixin.qq.com申请的)。 // 商户号 mch_id 是 10000098 String(32) 微信为发券方商户分配的商户号 // 随机字符串 nonce_str 是 1417574675 String(32) 随机字符串,不长于32位 // 签名 sign 是 841B3002FE2220C87A2D08ABD8A8F791 String(32) 签名参数,详见签名生成算法 // 微信调用接口 Map<String, String> resultMap = this.queryCouponsInfo(data); WXPayUtil.getLogger().info("wxPay.queryCouponsInfo:" + resultMap); return resultMap; }
在商户平台 - 产品中心 - 预充值立减与折扣 中开通功能便可,预充值立减与折扣是微信支付为商户提供的基础营销工具之一,商户能够在商户平台-营销中心配置预充值型立减或折扣,开展营销活动。
可自定义活动标题、减价面额、减价门槛、可用商户、预算、用户领取次数限制,也能够配置指定会员可用、指定某些商品享受优惠等。
此功能不须要开发,建立活动审核开通即生效,在微信支付时自动扣减。
关于立减功能的使用,这里就很少说了,很简单,小伙伴们能够在微信商户平台上阅读一下官方解释,进入产品详情建立一个活动测试一下便可。
这一篇讲解了如何开通代金券和立减优惠折扣,并贴上如何发送代金券、查询代金券等接口的源码,小伙伴须要仔细阅读官方文档,对照本篇文章,应该不会有什么问题。
这里主要是使用了预充值代金券
、预充值立减和折扣
,必须先充值足够的预算金额
才可使用功能,若是想要免充值
便可使用,须要开通免充值代金券
、免充值立减和折扣
,开通该两项功能须要走免充值产品功能使用指引
,该功能还须要接口升级,下一篇文章为你们介绍如何接口升级及开通免充值产品功能
。
若是小伙伴有遇到解决不了的问题,能够关注做者公众号,加入讨论群中发出疑问,和小伙伴们一块儿解决哦~
预告:下一篇文章会讲发放奖励的另外一种方式 商户平台-现金红包
,敬请期待!!!
若是想要提早一览源码的小伙伴,能够先看看个人 github,地址以下: https://github.com/YClimb/wxpay-sdk/blob/master/README.md
关注做者公众号,点击下方讨论群
,扫码便可加入微信支付讨论群
与小伙伴一块儿探讨哦~
到此本文就结束了,关注公众号查看更多推送!!!