# wx.requestMidasPaymentGameItem(Object object)

> 基础库 2.19.2 开始支持，低版本需做[兼容处理](1003706)。

> __以 [Promise 风格](/miniprogram/dev/framework/app-service/api.md#异步-API-返回-Promise) 调用__：不支持
> 
> __微信 Windows 版__：支持
> 
> __微信 Mac 版__：支持
> 
> __微信 鸿蒙 OS 版__：支持

## 功能描述

发起道具直购支付请求，可参考[虚拟支付2.0道具直购](/minigame/dev/guide/open-ability/virtual-payment/goods.md)，虚拟支付全流程可参考[技术手册-虚拟支付篇](/minigame/dev/guide/open-ability/virtual-payment/guide.md)

## 参数

### Object object


```json
[
  {
    "属性": "signData",
    "类型": "Object",
    "默认值": "",
    "必填": "是",
    "说明": "**支付原串**\n具体支付参数见下面的signData，需要将数据以json格式传递\nsignData例子:\n'{\"mode\":\"goods\",\"offerId\":\"123\",\"buyQuantity\":1,\"env\":0,\"currencyType\":\"CNY\",\"platform\":\"android\",\"zoneId\":\"1\",\"productId\":\"testproductId\",\"goodsPrice\":10,\"outTradeNo\":\"xxxxxx\",\"attach\":\"testdata\"}'",
    "子项": [
      {
        "结构属性": "mode",
        "类型": "string",
        "默认值": "",
        "必填": "是",
        "说明": "**支付的类型**\n不同的支付类型有各自额外要传的附加参数"
      },
      {
        "结构属性": "offerId",
        "类型": "string",
        "默认值": "",
        "必填": "是",
        "说明": "**在米大师侧申请的应用id**\nmp-支付基础配置中的offerid"
      },
      {
        "结构属性": "buyQuantity",
        "类型": "number",
        "默认值": "",
        "必填": "是",
        "说明": "**购买数量**"
      },
      {
        "结构属性": "env",
        "类型": "number",
        "默认值": "0",
        "必填": "否",
        "说明": "**环境配置**",
        "子项": [
          {
            "合法值": "0",
            "说明": "米大师正式环境"
          },
          {
            "合法值": "1",
            "说明": "米大师沙箱环境"
          }
        ]
      },
      {
        "结构属性": "currencyType",
        "类型": "string",
        "默认值": "",
        "必填": "是",
        "说明": "**币种**",
        "子项": [
          {
            "合法值": "CNY",
            "说明": "人民币"
          }
        ]
      },
      {
        "结构属性": "platform",
        "类型": "string",
        "默认值": "android",
        "必填": "否",
        "说明": "**平台**",
        "子项": [
          {
            "合法值": "android",
            "说明": "安卓"
          }
        ]
      },
      {
        "结构属性": "zoneId",
        "类型": "string",
        "默认值": "1",
        "必填": "否",
        "说明": "**分区ID**"
      },
      {
        "结构属性": "productId",
        "类型": "string",
        "默认值": "",
        "必填": "是",
        "说明": "**道具ID**"
      },
      {
        "结构属性": "goodsPrice",
        "类型": "number",
        "默认值": "",
        "必填": "是",
        "说明": "**道具单价（分）**\n用来校验价格与后台道具价格是否一致，避免用户在业务商城页看到的价格与实际价格不一致导致投诉"
      },
      {
        "结构属性": "outTradeNo",
        "类型": "string",
        "默认值": "",
        "必填": "是",
        "说明": "**业务订单号**\n每个订单号只能使用一次，重复使用会失败（极端情况不保证唯一，不建议业务强依赖唯一性）。\n要求32个字符内，只能是数字、大小写字母、符号 _-|*@组成，不能以下划线(_)开头。\n若没有传入，则平台会自动填充一个，并以下划线开头。"
      },
      {
        "结构属性": "attach",
        "类型": "string",
        "默认值": "",
        "必填": "否",
        "说明": "**透传数据**\n发货通知时会透传给开发者"
      }
    ]
  },
  {
    "属性": "paySig",
    "类型": "string",
    "默认值": "",
    "必填": "是",
    "说明": "**支付签名****pay_sig参数的签名算法，使用“mp-支付基础配置”**中的**AppKey**对支付的请求进行签名，代表请求经过开发者服务端的支付模块发起。签名算法伪代码为：\npaySig = to_hex(hmac_sha256(appKey,'requestMidasPaymentGameItem' + '&' + signData))\n具体可见代码示例中的支付签名代码实现"
  },
  {
    "属性": "signature",
    "类型": "string",
    "默认值": "",
    "必填": "是",
    "说明": "**用户态签名**\nsignature参数签名算法参考[用户态签名](/minigame/dev/guide/open-ability/signature.md#%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E6%80%81%E7%AD%BE%E5%90%8D)\n可参考[calc_signature](https://docs.qq.com/doc/DVUN0QWJja0J5c2x4)"
  },
  {
    "属性": "success",
    "类型": "function",
    "默认值": "",
    "必填": "否",
    "说明": "接口调用成功的回调函数"
  },
  {
    "属性": "fail",
    "类型": "function",
    "默认值": "",
    "必填": "否",
    "说明": "接口调用失败的回调函数"
  },
  {
    "属性": "complete",
    "类型": "function",
    "默认值": "",
    "必填": "否",
    "说明": "接口调用结束的回调函数（调用成功、失败都会执行）"
  }
]
```

## 错误
| 错误码 | 错误信息 | 说明 |
| -- | ---- | --- |
| -1 |  | 系统失败 |
| -2 |  | 支付取消 |
| -6 |  | 下单参数类型不对 |
| -15001 |  | 虚拟支付接口错误码，缺少参数 |
| -15002 |  | 虚拟支付接口错误码，参数不合法 |
| -15003 |  | 虚拟支付接口错误码，订单重复 |
| -15004 |  | 虚拟支付接口错误码，后台错误 |
| -15005 |  | 虚拟支付接口错误码，appId权限被封禁 |
| -15006 |  | 虚拟支付接口错误码，货币类型不支持 |
| -15007 |  | 虚拟支付接口错误码，订单已支付 |
| -15009 |  | 虚拟支付接口错误码，由于健康系统限制，本次支付已超过限额（这种错误情况会有默认弹窗提示） |
| -15010 |  | 虚拟支付接口错误码，正式版小游戏不允许在沙箱环境支付 |
| -15011 |  | 请求的数据类型错误 |
| -15012 |  | SIGNATURE错误 |
| -15013 |  | 代币未发布 |
| -15014 |  | paysig错误 |
| -15015 |  | sessionkey过期 |
| -15016 |  | 道具价格错误 |
| -15017 |  | 订单已关闭 |
| 1 |  | 虚拟支付接口错误码，用户取消支付 |
| 2 |  | 虚拟支付接口错误码，客户端错误,判断到小程序在用户处于支付中时,又发起了一笔支付请求 |
| 3 |  | 虚拟支付接口错误码，Android独有错误：用户使用GooglePlay支付，而手机未安装GooglePlay |
| 4 |  | 虚拟支付接口错误码，用户操作系统支付状态异常 |
| 5 |  | 虚拟支付接口错误码，操作系统错误 |
| 6 |  | 虚拟支付接口错误码，其他错误 |
| 7 |  | 虚拟支付接口错误码，支付取消 |
| 1000 |  | 参数错误 |
| 1001 |  | 分区未发布 |
| 1003 |  | 代币/分区未发布或者对应商户号被封禁或者米大师Portal错误,请先确保虚拟支付2.0代币和分区已发布，然后自查商户号封禁情况https://kf.qq.com/faq/190523Mb6VRJ190523RV363E.html，对应的商户号可以在mp-虚拟支付2.0-基础配置-微信支付账号信息中查询 |
| 3017/-15012 |  | 道具id非法 |
| 701001 |  | ios禁止支付 |

## 示例代码

```js
wx.requestMidasPaymentGameItem({
 signData: '{"mode":"goods","offerId":"123","buyQuantity":1,"env":0,"currencyType":"CNY","platform":"android","zoneId":"1","productId":"testproductId","goodsPrice":10,"outTradeNo":"xxxxxx","attach":"testdata"}',
 paySig: 'd0b8bbccbe34ed11549bcfd6602b08711f4acc0965253a949cd6a2b895152f9d',
 signature: 'd0b8bbccbe34ed11549bcfd6602b08711f4acc0965253a949cd6a2b895152f9d',
 success(res, errCode) {
     console.log('pay', res, errCode);
 },
 fail({
     errMsg,
     errCode
 }) {
     console.error(errMsg, errCode)
 }
```
支付签名代码实现
```python
  import hmac
  import hashlib
  import urllib.parse

  # sign_data 支付原串 注意这里sign_data需要和前端一致，原格式传递（包括空格和回车），建议后台下发，
  # appkey 米大师密钥
  # method 需要签名方法 requestMidasPaymentGameItem
  def gen_pay_sig(sign_data, appkey, method):
      need_encode_body = method + '&' + sign_data
      print(need_encode_body)
      return hmac.new(key=appkey.encode('utf-8'), msg=need_encode_body.encode('utf-8'),
              digestmod=hashlib.sha256).hexdigest()
```
