本文是【淺析微信支付】系列文章的第十四篇,主要講解在如何開通商戶平臺的代金券或立減優惠功能,商家向指定使用者傳送代金券,查詢傳送記錄,代金券資訊等。
淺析微信支付系列已經更新十四篇了喲~,沒有看過的朋友們可以看一下哦。
淺析微信支付:商戶平臺開通現金紅包、指定使用者發放、紅包記錄查詢
淺析微信支付:(餘額提現)企業付款到微信使用者零錢或銀行卡賬戶
首先我們需要了解一下什麼是代金券和立減優惠?
代金券是微信支付為商家提供的一個營銷工具,他的主要功能可以簡單理解為商家的滿減券,比如常見的“滿十減一”、“滿x減x”這類,需要使用者主動領取或者平臺主動為使用者發放,核銷時會在微信支付調起介面顯示優惠券資訊。
立減優惠是微信支付為商家提供的另一種自主核銷優惠,為何叫自主核銷?因為此優惠是一個門檻,不需要使用者領取,商家設定一個使用者群裡,比如全員優惠“滿十減一”,那麼所有人都可以享受這個優惠,直接在購買商品時自動扣減金額。
以上為簡單的解釋,下面我會結合官方文件來解釋這兩個優惠方式。
代金券
微信支付代金券業務是基於微信支付,為了協助商戶方便地實現營銷優惠措施。針對部分有開發能力的商戶,微信支付提供通過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複製程式碼
這裡說一下重點需要注意的地方,首先,代金券分為單品券和全場券,簡單理解:
- 單品券:指定某幾個商品ID的商品可以使用的代金券
- 全場券:所有商品都可以使用的代金券
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;
}複製程式碼
以上為發放代金券相關程式碼,下面是查詢代金券批次和代金券領取記錄介面。解釋下什麼叫做代金券批次和代金券記錄:
- 代金券批次:商戶平臺建立的一個批次代金券,包含x張代金券
- 代金券:代金券批次下的一張代金券,代金券ID在使用者領取代金券後由領取介面獲取
- 代金券記錄:使用者領券的代金券記錄,與代金券1:1,一個批次下有多個領取記錄
代金券批次查詢
官方文件如下:
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
關注作者微信公眾號,點選下方討論群
,掃碼即可加入微信支付討論群
與小夥伴一起探討哦~
到此本文就結束了,關注公眾號檢視更多推送!!!