wxpay-virtual.md 7.1 KB
Newer Older
1 2 3 4 5 6 7 8
## 简介

此文档是微信小程序虚拟支付的云端API补充,使用此文档的API需要先安装 [uni-pay](./uni-app.md) 插件才能使用,仅 uni-app 项目可用,uni-app-x 项目暂不支持微信支付,也不支持微信小程序虚拟支付

## Api 列表

提示:微信虚拟支付有很多API,当前仅支持以下几个常用的API,后面会陆续增加其他API

VK1688's avatar
VK1688 已提交
9 10 11 12
**特别说明**

以下API均只能在云端调用,不可以在前端调用

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
### 充值代币、道具直购

`充值代币``道具直购` 涉及到前端API,需要搭配 `uni-pay` 组件使用,详情见 [充值代币文档](./uni-app.md#short-series-coin)[道具直购文档](./uni-app.md#short-series-goods)

### 查询用户代币余额@queryUserBalance

**接口名**

`queryUserBalance`

**入参说明**

|    参数名     |  类型  |  必填  | 默认值 |    说明    |
| :-----------: | :----: | :---:| :----: |:--------: |
| openid        | String |  是  |   -    | 用户的openid |  
| userIp        | String |  是  |   -    | 用户的ip地址 | 

**返回值说明**

|    参数名         |  类型  |    说明    |
| :-----------:    | :----: | :--------: |
| balance          | Number |  代币总余额,包括有价和赠送部分|  
| presentBalance   | Number |  赠送账户的代币余额  | 
| sumSave          | Number | 累计有价货币充值数量   | 
| sumPresent       | Number | 累计赠送无价货币数量   | 
| sumBalance       | Number | 历史总增加的代币金额   | 
| sumCost          | Number | 历史总消耗代币金额  | 
| firstSaveFlag    | Boolean| 是否满足首充活动标记。0:不满足。1:满足   | 

**使用示例**

```js
// 引入 uni-pay-co 云对象
const uniPayCo = uniCloud.importObject("uni-pay-co");
// 请求微信虚拟支付API
let res = await uniPayCo.requestWxpayVirtualApi({
	method: "queryUserBalance", // 请求方法
	// 请求参数
	data: {
		openid: "", // 用户openid
		userIp: "", // 用户IP
	}
});
console.log('res: ', res);
```

### 扣减代币(一般用于代币支付)@currencyPay

**接口名**

`currencyPay`

**注意**

此API需要用到用户的 `sessionKey`,如果用户长时间没有活跃过小程序,则无法请求扣减代币接口,会报用户sessionKey不存在或已过期,请重新登录的错误

微信小程序虚拟支付退款后,如果退款的是代币充值订单,则退款成功后原本用户充值的代币不会自动扣减,需要执行此API才能扣减,而用户长时间没有活跃过小程序,则无法请求扣减代币接口,因此需要注意退款时间,时间相隔太长可能会导致出现无法扣减代币的尴尬情况

**入参说明**

|    参数名     |  类型  |  必填  | 默认值 |    说明    |
| :-----------: | :----: | :---:| :----: |:--------: |
| openid        | String |  是  |   -    | 用户的openid |  
| userIp        | String |  是  |   -    | 用户的ip地址 | 
| amount        | Number |  是  |   -    | 支付的代币数量 | 
| outTradeNo    | String |  是  |   -    | 订单号 | 
| deviceType    | Number |  是  |   -    | 平台类型1-安卓 2-苹果 | 
| payitem       | String |  否  |   -    | 物品信息。记录到账户流水中。如:[{"productid":"物品id", "unit_price": 单价, "quantity": 数量}],注意只能是json字符串格式 | 
| remark        | String |  否  |   -    | 备注 | 
| sessionKey    | String |  否  |   -    | 用户的sessionKey,不传会尝试自动获取 | 

**返回值说明**

|    参数名         |  类型  |    说明    |
| :-----------:    | :----: | :--------: |
| balance          | Number |  总余额,包括有价和赠送部分|  
| usedPresentAmount   | Number |  使用赠送部分的代币数量  | 
| outTradeNo          | String | 订单号原样返回   | 

**使用示例**

```js
// 引入 uni-pay-co 云对象
const uniPayCo = uniCloud.importObject("uni-pay-co");
let outTradeNo = "test-" + Date.now(); // 商户订单号
// 请求微信虚拟支付API
let res = await uniPayCo.requestWxpayVirtualApi({
	method: "currencyPay", // 请求方法
	// 请求参数
	data: {
		openid: "", // 用户openid
		userIp: "", // 用户IP
		amount: 1, // 扣减的代币数量
		outTradeNo, // 商户订单号
		payitem: JSON.stringify([{ "productid": "test001", "unit_price": 1, "quantity": 1 }]),
		remark: "备注",
		deviceType: 1, // 平台类型1-安卓 仅支持传1
	}
});
console.log('res: ', res);
```

### 代币支付退款(currencyPay接口的逆操作)@cancelCurrencyPay

**接口名**

`cancelCurrencyPay`

**入参说明**

|    参数名     |  类型  |  必填  | 默认值 |    说明    |
| :-----------: | :----: | :---:| :----: |:--------: |
| openid        | String |  是  |   -    | 用户的openid |  
| userIp        | String |  是  |   -    | 用户的ip地址 | 
| amount        | Number |  是  |   -    | 退款金额 | 
| outTradeNo    | String |  是  |   -    | 订单号 | 
| outRefundNo    | String |  是  |   -    | 本次退款单的单号 | 
| deviceType    | Number |  是  |   -    | 平台类型1-安卓 2-苹果 | 

**返回值说明**

|    参数名         |  类型  |    说明    |
| :-----------:    | :----: | :--------: |
| outRefundNo      | String |  退款订单号|  

**使用示例**

```js
// 引入 uni-pay-co 云对象
const uniPayCo = uniCloud.importObject("uni-pay-co");
let outTradeNo = "";
let lastFourDigits = Date.now().toString().substr(-4);
// 请求微信虚拟支付API
let res = await uniPayCo.requestWxpayVirtualApi({
	method: "cancelCurrencyPay", // 请求方法
	// 请求参数
	data: {
		openid: "", // 用户openid
		userIp: "", // 用户IP
		amount: 1, // 撤回扣减的代币数量
		outTradeNo, // 商户订单号
		outRefundNo: `${outTradeNo}-${lastFourDigits}`,
		deviceType: 1, // 平台类型1-安卓 仅支持传1
	}
});
console.log('res: ', res);
```

VK1688's avatar
VK1688 已提交
161
### 代币赠送@presentCurrency
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204

**接口名**

`presentCurrency`

**入参说明**

|    参数名     |  类型  |  必填  | 默认值 |    说明    |
| :-----------: | :----: | :---:| :----: |:--------: |
| openid        | String |  是  |   -    | 用户的openid |  
| userIp        | String |  是  |   -    | 用户的ip地址 | 
| amount        | Number |  是  |   -    | 退款金额 | 
| outTradeNo    | String |  是  |   -    | 订单号 | 
| deviceType    | Number |  是  |   -    | 平台类型1-安卓 2-苹果 | 

**返回值说明**

|    参数名         |  类型  |    说明    |
| :-----------:    | :----: | :--------: |
| balance          | String |  赠送后用户的代币余额|  
| presentBalance   | String |  用户收到的总赠送金额|  
| outTradeNo       | String |  赠送单号|  

**使用示例**

```js
// 引入 uni-pay-co 云对象
const uniPayCo = uniCloud.importObject("uni-pay-co");
let outTradeNo = "test-" + Date.now(); // 商户订单号
// 请求微信虚拟支付API
let res = await uniPayCo.requestWxpayVirtualApi({
	method: "presentCurrency", // 请求方法
	// 请求参数
	data: {
		openid: "", // 用户openid
		userIp: "", // 用户IP
		amount: 1, // 赠送用户代币数量
		outTradeNo, // 商户订单号
		deviceType: 1, // 平台类型1-安卓 仅支持传1
	}
});
console.log('res: ', res);
```