商户进件
特约商户进件
基础支付
JSAPI支付
APP支付
H5支付
Native支付
小程序支付
合单支付
付款码支付
经营能力
支付即服务
点金计划
行业方案
平台收付通
智慧商圈
微信支付分停车服务
电子发票
营销工具
代金券
商家券
委托营销
支付有礼
小程序发券插件
H5发券
图片上传(营销专用)
现金红包
资金应用
分账
连锁品牌分账
风险合规
商户开户意愿确认
消费者投诉2.0
商户平台处置通知
其他能力
图片上传
视频上传
微信支付平台证书

点金计划开发指引

1. 接口规则

为了在保证支付安全的前提下,带给商户简单、一致且易用的开发体验,我们推出了全新的微信支付APIv3接口。该版本API的具体规则请参考“APIv3接口规则

2. 开发准备

2.1. 搭建和配置开发环境

为了帮助开发者调用开放接口,我们提供了JAVA、PHP、GO三种语言版本的开发库,封装了签名生成、签名验证、敏感信息加/解密、媒体文件上传等基础功能(更多语言版本的开发库将在近期陆续提供

测试步骤

1、根据自身开发语言,选择对应的开发库并构建项目,具体配置请参考下面链接的详细说明:

    • wechatpay-java(推荐)wechatpay-apache-httpclient,适用于Java开发者。

    • wechatpay-php(推荐)、wechatpay-guzzle-middleware,适用于PHP开发者

    注:当前开发指引接口PHP示例代码采用wechatpay-guzzle-middleware版本

    • wechatpay-go,适用于Go开发者

更多资源可前往微信支付开发者社区搜索查看

2、创建加载商户私钥、加载平台证书、初始化httpClient的通用方法


@Before
public void setup() throws IOException {
    // 加载商户私钥(privateKey:私钥字符串)
    PrivateKey merchantPrivateKey = PemUtil
            .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
 
    // 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)
    AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
            new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8"));
 
    // 初始化httpClient
    httpClient = WechatPayHttpClientBuilder.create()
            .withMerchant(mchId, mchSerialNo, merchantPrivateKey)
            .withValidator(new WechatPay2Validator(verifier)).build();
}
 
@After
public void after() throws IOException {
    httpClient.close();
}

use GuzzleHttp\Exception\RequestException;
use WechatPay\GuzzleMiddleware\WechatPayMiddleware;
use WechatPay\GuzzleMiddleware\Util\PemUtil;
use GuzzleHttp\HandlerStack;
 
// 商户相关配置,
$merchantId = '1000100'; // 商户号
$merchantSerialNumber = 'XXXXXXXXXX'; // 商户API证书序列号
$merchantPrivateKey = PemUtil::loadPrivateKey('./path/to/mch/private/key.pem'); // 商户私钥文件路径
 
// 微信支付平台配置
$wechatpayCertificate = PemUtil::loadCertificate('./path/to/wechatpay/cert.pem'); // 微信支付平台证书文件路径
 
// 构造一个WechatPayMiddleware
$wechatpayMiddleware = WechatPayMiddleware::builder()
    ->withMerchant($merchantId, $merchantSerialNumber, $merchantPrivateKey) // 传入商户相关配置
    ->withWechatPay([ $wechatpayCertificate ]) // 可传入多个微信支付平台证书,参数类型为array
    ->build();
 
// 将WechatPayMiddleware添加到Guzzle的HandlerStack中
$stack = GuzzleHttp\HandlerStack::create();
$stack->push($wechatpayMiddleware, 'wechatpay');
 
// 创建Guzzle HTTP Client时,将HandlerStack传入,接下来,正常使用Guzzle发起API请求,WechatPayMiddleware会自动地处理签名和验签
$client = new GuzzleHttp\Client(['handler' => $stack]);

/*
    Package core 微信支付api v3 go http-client 基础库,你可以使用它来创建一个client,并向微信支付发送http请求
    只需要你在初始化客户端的时候,传递credential以及validator
    credential用来生成http header中的authorization信息
    validator则用来校验回包是否被篡改
    如果http请求返回的err为nil,一般response.Body 都不为空,你可以尝试对其进行序列化
    请注意及时关闭response.Body
    注意:使用微信支付apiv3 go库需要引入相关的包,该示例代码必须引入的包名有以下信息

    "context"
    "crypto/x509"
    "fmt"
    "io/ioutil"
    "log"
    "github.com/wechatpay-apiv3/wechatpay-go/core"
    "github.com/wechatpay-apiv3/wechatpay-go/core/option"
    "github.com/wechatpay-apiv3/wechatpay-go/utils"

    */
func SetUp() (opt []option.ClientOption, err error) {
    //商户号
    mchID := ""
    //商户证书序列号
    mchCertSerialNumber := ""
    //商户私钥文件路径
    privateKeyPath := ""
    //平台证书文件路径
    wechatCertificatePath := ""

    // 加载商户私钥
    privateKey, err := utils.LoadPrivateKeyWithPath(privateKeyPath)
    if err != nil {
        log.Printf("load private err:%s", err.Error())
        return nil, err
    }
    // 加载微信支付平台证书
    wechatPayCertificate, err := utils.LoadCertificateWithPath(wechatCertificatePath)
    if err != nil {
        log.Printf("load certificate err:%s",err)
        return nil, err
    }
    //设置header头中authorization信息
    opts := []option.ClientOption{
        option.WithMerchant(mchID, mchCertSerialNumber, privateKey), // 设置商户相关配置
        option.WithWechatPay([]*x509.Certificate{wechatPayCertificate}), // 设置微信支付平台证书,用于校验回包信息用
    }
    return opts, nil
}

3、基于接口的示例代码,替换请求参数后可发起测试

说明:

• 上面的开发库为微信支付官方开发库,其它没有审核或者控制下的第三方工具和库,微信支付不保证它们的安全性和可靠性

通过包管理工具引入SDK后,可根据下面每个接口的示例代码替换相关参数后进行快速测试

开发者如果想详细了解签名生成、签名验证、敏感信息加/解密、媒体文件上传等常用方法的具体代码实现,可阅读下面的详细说明:

    1.签名生成

    2.签名验证

    3.敏感信息加解密

    4.merchantPrivateKey(私钥)

    5.wechatpayCertificates(平台证书)

    6.APIV3Key(V3 key)

如想更详细的了解我们的接口规则,可查看我们的接口规则指引文档

2.2. 业务开发配置

2.2.1. 服务商开通点金计划

操作路径:【登录微信服务商平台 → 服务商功能 → 点金计划】,点击申请开通即可。

2.2.2. 开通官方小票配置

若仅为特约商户开通点金计划,未开通商家小票功能,该商户JSAPI支付后会展示官方小票样式。

操作路径:【登录微信服务商平台 → 服务商功能 → 点金计划】,在“特约商户管理” 模块中,打开“点金计划”开关。

开通官方小票后的页面展示如下图:



点击申请开通后进入开通流程,根据指引签署承诺函并填写业务联络人,即可提交申请并开通。

a、服务商也可通过“默认开通”按钮为全量特约商户开通点金计划。如下图所示,在特约商户管理列表 右上角有“默认开通点金计划”开关,打开后,只要特约商户产生jsapi支付,微信支付将自动为其 开通点金计划,无需服务商操作开通。(注:打开该开关后,有jsapi支付的特约商户均会自动开通点金计划,不可单个关闭。若特约商户 无jsapi支付,则不会为其自动打开点金计划。其中,若某些特约商户需使用“商家小票”功能,服务商/渠道商需在点金计划管理页面上或通过API额外为其打开商家小票功能开关。)

b、微信支付侧提供“点金计划管理API”,供服务商为特约商户批量开通点金计划,具体请查看 点金计划管理API。(注:主动关闭点金计划后,需间隔24 小时方可再次开通)

2.2.3. 开通商家小票配置

若为特约商户开通点金计划时,已开通了商家小票功能且已按开发文档完成接入,该商户JSAPI支付后会展示商家小票样式。

a. 服务商维度配置商家小票链接

配置路径:【登录微信支付服务商平台 → 服务商功能 → 点金计划】。在“商家小票链接配置” 模块中,点击“添加商家小票链接”:


b. 特约商户维度配置独立商家小票链接

配置路径:【登录微信支付服务商平台 → 服务商功能 → 点金计划】。在“特约商户管理” 模块中,点击“更多”添加“配置特约商户商家小票链接”:



a、完成商家小票链接配置后,服务商还需为特约商户打开商家小票的开关

b、配置完商家小票链接后,才会出现商家小票功能开关

c、服务商为特约商户打开“商家小票”开关后,还需为其打开“点金计划”开关,若特约商户的“点金计划”未开通,即使 “商家小票”功能开通,其JSAPI 支付后也不会展示点金计划页面和商家小票内容。

2.2.4. 使用“商家小票调试工具”进行调试

说明:为了保证商家小票在点金计划页面展示的兼容性、完整性,平台还提供了便捷的商家小票调试工具供服务商进行调试。服务商可通过商家小票调试工具,使用所选链接和真实订单号对点金计划页面的数据交互流程、前端JSAPI 的使用进行调试。

商家小票调试工具路径:【登录微信支付服务商平台 → 服务商功能 → 点金计划】在“商家小票链接配置” 模块右边,点击“商家小票调试工具”


3. 快速接入

3.1. 业务流程图


重点步骤说明:

步骤5 已打开特约商户的商家小票及点金计划开关

步骤11 商家小票页面需调用父页面“onIframeReady事件”的jsapi,请查看商家小票开发指引
在商家小票页面渲染完成后,调用父页面的‘’onIframeReady‘’事件的JSAPI,并且从加载商家小票页面开始到调用’onIframeReady‘’事件的JSAPI之间的用时不可超过3s,否则会提示无法获取订单信息。


3.2. API接入(含示例代码)

文档展示了如何使用微信支付服务端 SDK 快速接入JSAPI支付产品,完成与微信支付对接的部分。

注意

  • 文档中的代码示例是用来阐述 API 基本使用方法,代码中的示例参数需替换成商户自己账号及请求参数才能跑通
  • 以下接入步骤仅提供参考,请商户结合自身业务需求进行评估、修改。
3.2.1. 【服务端】点金计划管理

步骤说明:服务商使用此接口为特约商户开通或关闭点金计划。

示例代码


public void GoldPlanStatus() throws Exception{
    //请求URL
    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/goldplan/merchants/changegoldplanstatus");
    // 请求body参数
    String reqdata = "{"
            + "\"sub_mchid\":\"1234567890\","
            + "\"operation_type\":\"OPEN\""
            + "}";
    StringEntity entity = new StringEntity(reqdata,"utf-8");
    entity.setContentType("application/json");
    httpPost.setEntity(entity);
    httpPost.setHeader("Accept", "application/json");

    //完成签名并执行请求
    CloseableHttpResponse response = httpClient.execute(httpPost);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //处理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //处理成功,无返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

try {
    $resp = $client->request(
        'POST',
        'https://api.mch.weixin.qq.com/v3/goldplan/merchants/changegoldplanstatus', //请求URL
        [
            // JSON请求体
            'json' => [
                "sub_mchid" => "1234567890", 
                "operation_type" => "OPEN",
            ],
            'headers' => [ 'Accept' => 'application/json' ]
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //处理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //处理成功,无返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 进行错误处理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func GoldPlanStatus() {
       // 初始化客户端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //设置请求地址
  URL := "https://api.mch.weixin.qq.com/v3/goldplan/merchants/changegoldplanstatus"
  //设置请求信息,此处也可以使用结构体来进行请求
  mapInfo := map[string]interface{}{
    "sub_mchid": "1234567890",
    "operation_type": "OPEN",
  }

  // 发起请求
  response, err := client.Post(ctx, URL, mapInfo)
  if err != nil{
    log.Printf("client post err:%s",err)
    return
  }
  // 校验回包内容是否有逻辑错误
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 读取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
    

重要入参说明

sub_mchid:特约商户号,开通或关闭点金计划的特约商户商户号,由微信支付生成并下发

operation_type:操作类型, 开通或关闭点金计划的动作,枚举值
  OPEN:表示开通点金计划
  CLOSE:表示关闭点金计划

更多参数、响应详情及错误码请参见点金计划管理接口文档

3.2.2. 【服务端】商家小票管理

步骤说明:服务商使用此接口为特约商户开通或关闭商家小票功能。

示例代码


public void CustomPageStatus() throws Exception{
    //请求URL
    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/goldplan/merchants/changecustompagestatus");
    // 请求body参数
    String reqdata = "{"
            + "\"sub_mchid\":\"1234567890\","
            + "\"operation_type\":\"OPEN\""
            + "}";
    StringEntity entity = new StringEntity(reqdata,"utf-8");
    entity.setContentType("application/json");
    httpPost.setEntity(entity);
    httpPost.setHeader("Accept", "application/json");

    //完成签名并执行请求
    CloseableHttpResponse response = httpClient.execute(httpPost);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //处理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //处理成功,无返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

try {
    $resp = $client->request(
        'POST',
        'https://api.mch.weixin.qq.com/v3/goldplan/merchants/changecustompagestatus', //请求URL
        [
            // JSON请求体
            'json' => [
                "sub_mchid" => "1234567890", 
                "operation_type" => "OPEN",
            ],
            'headers' => [ 'Accept' => 'application/json' ]
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //处理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //处理成功,无返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 进行错误处理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func CustomPageStatus() {
       // 初始化客户端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //设置请求地址
  URL := "https://api.mch.weixin.qq.com/v3/goldplan/merchants/changecustompagestatus"
  //设置请求信息,此处也可以使用结构体来进行请求
  mapInfo := map[string]interface{}{
    "sub_mchid": "1234567890",
    "operation_type": "OPEN",
  }

  // 发起请求
  response, err := client.Post(ctx, URL, mapInfo)
  if err != nil{
    log.Printf("client post err:%s",err)
    return
  }
  // 校验回包内容是否有逻辑错误
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 读取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
    

重要入参说明

sub_mchid:特约商户号,开通或关闭点金计划的特约商户商户号,由微信支付生成并下发

operation_type:开通或关闭“商家自定义小票”的动作,枚举值:
  OPEN:表示开通点金计划
  CLOSE:表示关闭点金计划

更多参数、响应详情及错误码请参见商家小票管理接口文档

3.2.3. 【服务端】同业过滤标签管理

步骤说明:服务商使用此接口为特约商户配置同业过滤标签,防止特约商户支付后出现同行业的广告内容 示例代码。

示例代码


public void AdvertisingFilter() throws Exception{
  // 加载商户私钥(privateKey:私钥字符串)
  PrivateKey merchantPrivateKey = PemUtil
          .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));

  // 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3秘钥)
  AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
          new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8"));

  CloseableHttpClient httpClient = HttpClients.createDefault();
  // 初始化httpClient
  httpClient = WechatPayHttpClientBuilder.create()
          .withMerchant(mchId, mchSerialNo, merchantPrivateKey)
          .withValidator(new WechatPay2Validator(verifier)).build();

  //请求URL
  HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/goldplan/merchants/set-advertising-industry-filter");
  // 请求body参数
  String reqdata = "{"
          + "\"sub_mchid\":\"1900000109\","
          + "\"advertising_industry_filters\": ["
          + "\"SOFTWARE\","
          + "\"SECURITY\","
          + "\"LOVE_MARRIAGE\""
          + "]"
          + "}";
  StringEntity entity = new StringEntity(reqdata,"utf-8");
  entity.setContentType("application/json");
  httpPost.setEntity(entity);
  httpPost.setHeader("Accept", "application/json");

  //完成签名并执行请求
  CloseableHttpResponse response = httpClient.execute(httpPost);

  try {
      int statusCode = response.getStatusLine().getStatusCode();
      if (statusCode == 200) { //处理成功
          System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
      } else if (statusCode == 204) { //处理成功,无返回Body
          System.out.println("success");
      } else {
          System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
          throw new IOException("request failed");
      }
  } finally {
      response.close();
  }
}
    

try {
    $resp = $client->request(
        'POST',
        'https://api.mch.weixin.qq.com/v3/goldplan/merchants/set-advertising-industry-filter', //请求URL
        [
            // JSON请求体
            'json' => [
                "sub_mchid" => "1900000109", 
                "advertising_industry_filters" => [
                    "0" => "SOFTWARE", 
                    "1" => "SECURITY", 
                    "2" => "LOVE_MARRIAGE", 
                ]
            ],
            'headers' => [ 'Accept' => 'application/json' ]
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //处理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //处理成功,无返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 进行错误处理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func AdvertisingFilter() {
       // 初始化客户端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //设置请求地址
  URL := "https://api.mch.weixin.qq.com/v3/goldplan/merchants/set-advertising-industry-filter"
  //设置请求信息,此处也可以使用结构体来进行请求
  mapInfo := map[string]interface{}{
    "sub_mchid": "1900000109",
    "advertising_industry_filters": [...]interface{}{
      "SOFTWARE",
      "SECURITY",
      "LOVE_MARRIAGE",
    },
  }

  // 发起请求
  response, err := client.Post(ctx, URL, mapInfo)
  if err != nil{
    log.Printf("client post err:%s",err)
    return
  }
  // 校验回包内容是否有逻辑错误
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 读取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
    

重要入参说明

sub_mchid:特约商户号,开通或关闭点金计划的特约商户商户号,由微信支付生成并下发

advertising_industry_filters:同业过滤标签值,特约商户同业过滤的同业过滤标签值,同业过滤标签最少传一个,最多三个。
  如已设置同业过滤标签,再次请求传入,视为新增,将覆盖原有同业标签配置。枚举值:
  E_COMMERCE:综合电商平台
  LOVE_MARRIAGE:婚恋
  POTOGRAPHY:摄影摄像机构及服务
  EDUCATION:教育
  FINANCE:金融
  TOURISM:旅游
  SKINCARE:护肤彩妆

更多参数、响应详情及错误码请参见同业过滤标签管理接口文档

3.2.4. 【服务端】开通广告展示

步骤说明:服务商使用此接口为特约商户开通或关闭点金计划。

示例代码


public void OpenAdvShow() throws Exception{
    //请求URL
    HttpPatch  httpPatch  = new HttpPatch("https://api.mch.weixin.qq.com/v3/goldplan/merchants/open-advertising-show");
    // 请求body参数
    String reqdata = "{"
            + "\"sub_mchid\":\"1900000109\","
            + "\"advertising_industry_filters\": ["
            + "\"0\":\"SOFTWARE\","
            + "\"1\":\"SECURITY\","
            + "\"2\":\"LOVE_MARRIAGE\""
            + "]"
            + "}";
    StringEntity entity = new StringEntity(reqdata,"utf-8");
    entity.setContentType("application/json");
    httpPatch.setEntity(entity);
    httpPatch.setHeader("Accept", "application/json");

    //完成签名并执行请求
    CloseableHttpResponse response = httpClient.execute(httpPatch);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //处理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //处理成功,无返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

try {
    $resp = $client->request(
        'PATCH',
        'https://api.mch.weixin.qq.com/v3/goldplan/merchants/open-advertising-show', //请求URL
        [
            // JSON请求体
            'json' => [
                "sub_mchid" => "1900000109", 
                "advertising_industry_filters" => [
                    "0" => "SOFTWARE", 
                    "1" => "SECURITY", 
                    "2" => "LOVE_MARRIAGE", 
                ]
            ],
            'headers' => [ 'Accept' => 'application/json' ]
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //处理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //处理成功,无返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 进行错误处理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func OpenAdvShow() {
       // 初始化客户端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //设置请求地址
   URL := "https://api.mch.weixin.qq.com/v3/goldplan/merchants/open-advertising-show"
  //设置请求信息,此处也可以使用结构体来进行请求
  mapInfo := map[string]interface{}{
    "sub_mchid": "1900000109",
    "advertising_industry_filters": [...]interface{}{
      "SOFTWARE",
      "SECURITY",
      "LOVE_MARRIAGE",
    },
  }

  // 发起请求
  response, err := client.Patch(ctx, URL, mapInfo)
  if err != nil{
    log.Printf("client patch err:%s",err)
    return
  }
  // 校验回包内容是否有逻辑错误
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 读取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
    

重要入参说明

sub_mchid:特约商户号,开通或关闭点金计划的特约商户商户号,由微信支付生成并下发

advertising_industry_filters:同业过滤标签值,特约商户同业过滤的同业过滤标签值,同业过滤标签最少传一个,最多三个。
  如已设置同业过滤标签,再次请求传入,视为新增,将覆盖原有同业标签配置。枚举值:
   E_COMMERCE:综合电商平台
  LOVE_MARRIAGE:婚恋
  POTOGRAPHY:摄影摄像机构及服务
  EDUCATION:教育
  FINANCE:金融
  TOURISM:旅游
  SKINCARE:护肤彩妆
  FOOD:食品
  SPORT:运动户外
  JEWELRY_WATCH:珠宝钟表

更多参数、响应详情及错误码请参见开通广告展示接口文档

3.2.5. 【服务端】关闭广告展示

步骤说明:使用此接口为特约商户的点金计划页面关闭广告展示功能。

示例代码


public void CloseAdvShow() throws Exception{
    //请求URL
    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/goldplan/merchants/close-advertising-show");
    // 请求body参数
    String reqdata = "{"
            + "\"sub_mchid\":\"1900000109\""
            + "}";
    StringEntity entity = new StringEntity(reqdata,"utf-8");
    entity.setContentType("application/json");
    httpPost.setEntity(entity);
    httpPost.setHeader("Accept", "application/json");

    //完成签名并执行请求
    CloseableHttpResponse response = httpClient.execute(httpPost);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //处理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //处理成功,无返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

 try {
    $resp = $client->request(
        'POST',
        'https://api.mch.weixin.qq.com/v3/goldplan/merchants/close-advertising-show', //请求URL
        [
            // JSON请求体
            'json' => [
                "sub_mchid" => "1900000109",
            ],
            'headers' => [ 'Accept' => 'application/json' ]
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //处理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //处理成功,无返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 进行错误处理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func CloseAdvShow() {
       // 初始化客户端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //设置请求地址
  URL := "https://api.mch.weixin.qq.com/v3/goldplan/merchants/close-advertising-show"
  //设置请求信息,此处也可以使用结构体来进行请求
  mapInfo := map[string]interface{}{
    "sub_mchid": "1900000109",
  }

  // 发起请求
  response, err := client.Post(ctx, URL, mapInfo)
  if err != nil{
    log.Printf("client post err:%s",err)
    return
  }
  // 校验回包内容是否有逻辑错误
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 读取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
    

重要入参说明

sub_mchid:特约商户号,开通或关闭点金计划的特约商户商户号,由微信支付生成并下发

更多参数、响应详情及错误码请参见关闭广告展示接口文档

4. 常见问题

Q:为特约商户开通/关闭点金计划后,多久后会生效?

A:为特约商户开通后,5分钟内其支付回调页会替换为点金计划页面

Q:为什么看不到“商家小票”开关?

A:需要在商家小票链接配置模块,添加商家小票链接,才会在特约商户管理模块出现“商家小票”开关

Q:调试商家小票时出现“无法获取订单信息”页面,是什么原因导致的?

A:调试时需确认以下事项:

1. 已打开特约商户的商家小票及点金计划开关

2. 商家小票页面需调用父页面“onIframeReady事件”的jsapi,具体请查看商家小票开发指引

3. 从加载商家小票到调用JSAPI之间的用时不可超过3s

4. 调试时,扫描二维码的微信号和支付该笔测试订单的微信号需为同一个

5. 商家小票页面可正常访问

Q:服务商返佣具体怎么计算?10003”

A:返佣奖励(元)=eCPM(元)/1000 *支付后广告曝光量 。其中:

1. eCPM是广告每千次曝光的收益金额

2. 用户支付后快速离开页面或弱网等情况会导致部分订单无法曝光广告

Q:特约商户开通了点金计划后,支付后页面的展示形式?

A:开通点金计划之后,用户在支付完成页点击“完成”后,只会展示点金计划页面,不会再展示服务商的支付回调页。无须担心业务内容被阻断,可通过点金计划页面的“商家小票”功能嵌入商家的服务性内容(例如取餐码、停车剩余时长等)

Q:为什么特约商户开通点金计划后,在支付后并没有出现点金计划官方页面?

A:①请确保支付类型为JSAPI支付;   ②请确保微信版本号iOS系统为7.0.7及以上,安卓系统为7.0.9及以上(?是否需要更新)



技术咨询

文档反馈