1. 程式人生 > >淺析微信支付:商戶平臺代金券或立減優惠開通、指定用戶代金券發放、查詢等

淺析微信支付:商戶平臺代金券或立減優惠開通、指定用戶代金券發放、查詢等

憑據 企業 creat readme 沒有 操作員 dex ppi tps

本文是【淺析微信支付】系列文章的第十四篇,主要講解在如何開通商戶平臺的代金券或立減優惠功能,商家向指定用戶發送代金券,查詢發送記錄,代金券信息等。


淺析微信支付系列已經更新十四篇了喲~,沒有看過的朋友們可以看一下哦。

淺析微信支付:商戶平臺開通現金紅包、指定用戶發放、紅包記錄查詢

淺析微信支付:(余額提現)企業付款到微信用戶零錢或銀行卡賬戶

淺析微信支付:支付驗收示例和驗收指引

淺析微信支付:如何使用沙箱環境測試

首先我們需要了解一下什麽是代金券和立減優惠?

代金券是微信支付為商家提供的一個營銷工具,他的主要功能可以簡單理解為商家的滿減券,比如常見的“滿十減一”、“滿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

這裏說一下重點需要註意的地方,首先,代金券分為單品券和全場券,簡單理解:

  1. 單品券:指定某幾個商品ID的商品可以使用的代金券
  2. 全場券:所有商品都可以使用的代金券

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;
}

以上為發放代金券相關代碼,下面是查詢代金券批次和代金券領取記錄接口。
解釋下什麽叫做代金券批次和代金券記錄:

  1. 代金券批次:商戶平臺創建的一個批次代金券,包含x張代金券
  2. 代金券:代金券批次下的一張代金券,代金券ID在用戶領取代金券後由領取接口獲取
  3. 代金券記錄:用戶領券的代金券記錄,與代金券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 ?

關註作者微信公眾號,點擊下方討論群,掃碼即可加入微信支付討論群與小夥伴一起探討哦~

到此本文就結束了,關註公眾號查看更多推送!!!


技術分享圖片


淺析微信支付:商戶平臺代金券或立減優惠開通、指定用戶代金券發放、查詢等