request-payment.md 7.1 KB
Newer Older
D
DCloud_LXH 已提交
1 2 3
## uni.requestPayment(options) @requestpayment

<!-- UTSAPIJSON.requestPayment.description -->
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
4

D
DCloud_LXH 已提交
5 6
<!-- UTSAPIJSON.requestPayment.compatibility -->

zhaofengliang920817's avatar
zhaofengliang920817 已提交
7 8 9 10 11 12 13 14 15 16 17
uni.requestPayment是一个统一各平台的客户端支付API,客户端均使用本API调用支付。

本API运行在各端时,会自动转换为各端的原生支付调用API。

注意支付不仅仅需要客户端的开发,还需要服务端开发。虽然客户端API统一了,但各平台的支付申请开通、配置回填仍然需要看各个平台本身的支付文档。

比如微信有App支付的申请入口和使用流程,对应到uni-app,在App端要申请微信的App支付。

如果服务端使用[uniCloud](https://uniapp.dcloud.io/uniCloud/README),那么官方提供了[uniPay](https://doc.dcloud.net.cn/uniCloud/uni-pay/uni-app.html)云端统一支付服务,把App、微信小程序、支付宝小程序里的服务端支付开发进行了统一的封装。

前端统一的`uni.requestPayment`和云端统一的`uniPay`搭配,可以极大提升支付业务的开发效率,强烈推荐给开发者使用。`uniPay`的文档另见:[https://doc.dcloud.net.cn/uniCloud/uni-pay/uni-app.html](https://doc.dcloud.net.cn/uniCloud/uni-pay/uni-app.html)
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
18

D
DCloud_LXH 已提交
19 20
<!-- UTSAPIJSON.requestPayment.param -->

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
21 22
### orderInfo参数说明

D
DCloud_LXH 已提交
23
 - 支付宝\
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
24
  App 支付请求参数字符串,主要包含商家的订单信息,key=value 形式,以 & 连接。示例
D
DCloud_LXH 已提交
25 26
  ```
  app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%22%22%2C%22product_code%
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
27 28 29 30 31
  22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.02%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%
  91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22
  %2C%22out_trade_no%22%3A%22314VYGIAGG7ZOYY%22%7D&charset=utf-8&method=alipay.trade.app.pay&sign_type=R
  SA2&timestamp=2016-08-15%2012%3A12%3A15&version=1.0&sign=MsbylYkCzlfYLy9PeRwUUIg9nZPeN9SfXPNavUCroGKR5Kqvx0nEnd3eRmKxJuthNUx4ERCXe552
  EV9PfwexqW%2B1wbKOdYtDIb4%2B7PL3Pc94RZL0zKaWcaY3tSL89%2FuAVUsQuFqEJd
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
32 33
  hIukuKygrXucvejOUgTCfoUdwTi7z%2BZzQ%3D<br>
  ```
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
34
  [更多详情参考[支付宝官方文档](https://opendocs.alipay.com/open/204/105296?pathHash=22ed0058&ref=api)]
D
DCloud_LXH 已提交
35
 -  微信\
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
36
  App 支付请求参数字符串,需要打自定义基座。示例
D
DCloud_LXH 已提交
37 38 39 40 41 42 43 44 45 46
  ```json
  {
   "appid":"wxd569c7238830733b",
   "noncestr":"6N47VnR42bqIm4xq",
   "package":"Sign=WXPay",
   "partnerid":"1230636401",
   "prepayid":"wx26174750316675ac54b89c224eb3250000",
   "timestamp":1711446470,
   "sign":"EE987459B9CFF6462462147130110D31"
  }
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
47
  ```
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
48 49
  [更多详情参考[微信官方文档]( https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1)]

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
50

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
51

D
DCloud_LXH 已提交
52 53
<!-- UTSAPIJSON.requestPayment.returnValue -->

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
54 55
<!-- UTSAPIJSON.requestPayment.tutorial -->

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
56 57
### cause支付sdk错误码汇总

D
DCloud_LXH 已提交
58
#### 支付宝支付
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
59 60 61 62 63 64 65 66 67 68 69
| 支付宝错误码 | 错误信息 |
|---|---|
| -9000 | 订单支付成功 |
| -8000 | 正在处理中,支付结果未知(有可能已经支付成功),请查询商家订单列表中订单的支付状态 |
| -4000 | 订单支付失败 |
| -5000 | 重复请求 |
| -6001 | 用户中途取消 |
| -6002 | 网络连接出错 |
| -6004 | 支付结果未知(有可能已经支付成功),请查询商家订单列表中订单的支付状态 |
|  其它  | 其它支付错误 |

zhaofengliang920817's avatar
zhaofengliang920817 已提交
70
### 注意
W
wanganxp 已提交
71
- App平台开发支付宝支付,无需自定义基座,真机运行可直接开发
zhaofengliang920817's avatar
zhaofengliang920817 已提交
72
- 判断微信是否安装可以通过`uni.getProvider`的方式,详见[uni.getProvider](https://doc.dcloud.net.cn/uni-app-x/api/get-provider.html#getprovider)
D
DCloud_LXH 已提交
73 74

```ts
zhaofengliang920817's avatar
zhaofengliang920817 已提交
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
   uni.getProvider({
      service: "payment",
      success: (e) => {
         const provider = e.providers.find((item): boolean => {
            return item.id == 'wxpay'
         })

         if (provider?.isAppExist == false) {
            console.log('WeChat 没有安装')
         } else {
            console.log('WeChat 已安装')
         }
      },
      fail: (e) => {
         console.log("获取支付通道失败:", e);
      }
   })
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
92
```
D
DCloud_LXH 已提交
93

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
94
- **app需要在根目录manifest.json文件中配置`uni-payment`节点,详见 [https://doc.dcloud.net.cn/uni-app-x/collocation/manifest-modules.html#uni-payment模块配置](https://doc.dcloud.net.cn/uni-app-x/collocation/manifest-modules.html#uni-payment)**
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
95
- app-android平台微信支付需要4.11及以上版本
zhaofengliang920817's avatar
zhaofengliang920817 已提交
96
- app-ios平台微信支付需要4.18及以上版本
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
97

W
wanganxp 已提交
98

D
DCloud_LXH 已提交
99
<!-- UTSAPIJSON.requestPayment.example -->
D
DCloud_LXH 已提交
100

D
DCloud_LXH 已提交
101 102
<!-- UTSAPIJSON.general_type.name -->

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
103
<!-- UTSAPIJSON.general_type.param -->
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
104

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
105 106 107

## 支付provider对象描述

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
108
### UniPaymentAlipayProvider(阿里支付)
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
109

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
110 111 112 113 114
| 名称           | 类型      | 必备 | 默认值  | 描述                                  |
| -------------- | --------- | ---- | ------ | ------------------------------------- |
| id             | string    | 是   | -      | 服务供应商标识                        |
| description    | string    | 是   | -      | 服务供应商描述                        |
| ~~isAppExist~~      | boolean   | 是   | -      | 已废弃,判断服务供应商依赖的App是否安装(仅支持微信支付) |
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
115

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
116
### UniPaymentWxpayProvider(微信支付)
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
117

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
118 119 120 121 122 123
| 名称           | 类型      | 必备 | 默认值  | 描述                                  |
| -------------- | --------- | ---- | ------ | ------------------------------------- |
| id             | string    | 是   | -      | 服务供应商标识                        |
| description    | string    | 是   | -      | 服务供应商描述                        |
| ~~isAppExist~~      | boolean   | 是   | -      | 已废弃,判断服务供应商依赖的App是否安装(仅支持微信支付) |
| isWeChatInstalled     | boolean   | 是    | -      | 判断微信是否安装 |
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
124 125 126



WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
127 128 129 130 131 132 133 134 135
## 自定义支付provider接入到uni API 

背景:目前基座已经内置了阿里支付,微信支付,基于开放的原则,在以上支付不满足用户需求的情况下,

用户可以基于我们规范化的接口,错误信息描述等实现自己的支付需求,而在最终使用方式上与内置API无任何差别。

举个例子,用户想使用uni.requestPayment()的方式调用阿里支付,但是内置支付api不支持(这里假设内置api不支持阿里支付),

那只需要按照下面四个步骤实现即可:
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
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 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176

第一步,在interface.uts 中定义接口,继承UniPaymentProvider,代码如下

```ts
export interface UniPaymentAlipayProvider extends UniPaymentProvider{}
```

第二步,在app-android或者app-ios的index.uts中实现接口,代码如下

```ts
import { UniPaymentAlipayProvider } from '../interface.uts'
export class UniPaymentAlipayProviderImpl implements UniPaymentAlipayProvider{
	override id : String = "alipay"
	override description : String = "Alipay"
	override isAppExist : boolean | null = null
	
	constructor(){}

	override requestPayment(options : RequestPaymentOptions) {
		//todo 具体逻辑
	}
}
```

第三步,在manifest.json中配置

```ts
  "app": {
    "distribute": {
      /* android打包配置 */
      "modules": {
        "uni-payment":{
          "alipay":{}
        }
      }
    }
  }
```

第四步,打自定义基座

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
177 178
[示例代码](https://gitcode.net/dcloud/uni-api/-/tree/master/uni_modules/uni-payment-alipay)