# 商户平台代金券或立减优惠开通、指定用户代金券发放、查询等

浅析微信支付系列已经更新十四篇了哟～，没有看过的朋友们可以看一下哦。

[浅析微信支付：商户平台开通现金红包、指定用户发放、红包记录查询](https://mp.weixin.qq.com/s/3fi9TjNMpZ9AbrcNZF1vKA)

[浅析微信支付：(余额提现)企业付款到微信用户零钱或银行卡账户](https://mp.weixin.qq.com/s/YZkrbYm5t8HJPT_S4W9zrQ)

[浅析微信支付：支付验收示例和验收指引](https://mp.weixin.qq.com/s/YESU2V5byxfM8z9YQXgnuA)

[浅析微信支付：如何使用沙箱环境测试](https://mp.weixin.qq.com/s/WmnsCnIrhN9STbvrNTQOiA)

首先我们需要了解一下什么是代金券和立减优惠？

代金券是微信支付为商家提供的一个营销工具，他的主要功能可以简单理解为商家的满减券，比如常见的“满十减一”、“满x减x”这类，需要用户主动领取或者平台主动为用户发放，核销时会在微信支付调起界面显示优惠券信息。

立减优惠是微信支付为商家提供的另一种自主核销优惠，为何叫自主核销？因为此优惠是一个门槛，不需要用户领取，商家设置一个用户群里，比如全员优惠“满十减一”，那么所有人都可以享受这个优惠，直接在购买商品时自动扣减金额。

以上为简单的解释，下面我会结合官方文档来解释这两个优惠方式。

#### 代金券

微信支付代金券业务是基于微信支付，为了协助商户方便地实现营销优惠措施。针对部分有开发能力的商户，微信支付提供通过API接口实现运营代金券的功能

官方文档地址：

```
https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_2&index=2
```

首先，这里我们讲接口发放代金券的方式，下面是代金券的三个接口：&#x20;

![代金券接口介绍](https://img-blog.csdnimg.cn/20181120163710717.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lDbGltYg==,size_16,color_FFFFFF,t_70)

操作代金券开通和如何手动创建的官方文档如下：

```
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源码。

[浅析微信支付：统一下单接口](https://mp.weixin.qq.com/s/lYPiad1pyZ6ZdqH-sg66eg)

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
```

是否需要证书：否

请求参数主要为代金券批次id`coupon_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 ​`

关注作者微信公众号，点击下方`讨论群`，扫码即可加入`微信支付讨论群`与小伙伴一起探讨哦～

到此本文就结束了，关注公众号查看更多推送！！！

![关注我的公众号](https://img-blog.csdn.net/20180130111432962?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWUNsaW1i/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yclimb.gitbook.io/wxpay/coupon/coupon.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
