本文是【淺析微信支付】系列文章的第十四篇,主要講解在如何開通商戶平臺的代金券或立減優惠功能,商家向指定用戶發送代金券,查詢發送記錄,代金券信息等。php
淺析微信支付系列已經更新十四篇了喲~,沒有看過的朋友們能夠看一下哦。git
淺析微信支付:商戶平臺開通現金紅包、指定用戶發放、紅包記錄查詢github
淺析微信支付:(餘額提現)企業付款到微信用戶零錢或銀行卡帳戶算法
首先咱們須要瞭解一下什麼是代金券和立減優惠?數組
代金券是微信支付爲商家提供的一個營銷工具,他的主要功能能夠簡單理解爲商家的滿減券,好比常見的「滿十減一」、「滿x減x」這類,須要用戶主動領取或者平臺主動爲用戶發放,覈銷時會在微信支付調起界面顯示優惠券信息。bash
立減優惠是微信支付爲商家提供的另外一種自主覈銷優惠,爲什麼叫自主覈銷?由於此優惠是一個門檻,不須要用戶領取,商家設置一個用戶羣裏,好比全員優惠「滿十減一」,那麼全部人均可以享受這個優惠,直接在購買商品時自動扣減金額。微信
以上爲簡單的解釋,下面我會結合官方文檔來解釋這兩個優惠方式。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
關注做者微信公衆號,點擊下方討論羣
,掃碼便可加入微信支付討論羣
與小夥伴一塊兒探討哦~
到此本文就結束了,關注公衆號查看更多推送!!!