request-payment.md 7.9 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参数说明

DCloud-yyl's avatar
DCloud-yyl 已提交
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)]
DCloud-yyl's avatar
DCloud-yyl 已提交
35 36
 
 -  微信支付  
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
37
  App 支付请求参数字符串,需要打自定义基座。示例
D
DCloud_LXH 已提交
38 39 40 41 42 43 44 45 46 47
  ```json
  {
   "appid":"wxd569c7238830733b",
   "noncestr":"6N47VnR42bqIm4xq",
   "package":"Sign=WXPay",
   "partnerid":"1230636401",
   "prepayid":"wx26174750316675ac54b89c224eb3250000",
   "timestamp":1711446470,
   "sign":"EE987459B9CFF6462462147130110D31"
  }
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
48
  ```
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
49 50
  [更多详情参考[微信官方文档]( https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1)]

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
51

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
52

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

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

DCloud-yyl's avatar
DCloud-yyl 已提交
57 58 59
### 支付SDK错误码

支付失败时可通过错误回调参数`IRequestPaymentFail`中的`cause`属性获取支付SDK的源错误信息,类型为[SourceError](https://uniapp.dcloud.net.cn/tutorial/err-spec.html#sourceerror),其包含 code 属性存储了支付SDK的原始错误码。 
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
60

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

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
#### 微信支付

| 微信支付错误码 | 错误信息 |
|---|---|
| 0 | 成功 |
| -1 | 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常原因等 |
| -2 | 无需处理。发生场景:用户不支付了,点击取消,返回APP |
| -3 | 发送失败 |
| -4 | 授权被拒绝 |
| -5 | 不支持 |
| -6 | 禁止 |
| 其它 | 其它支付错误 |





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

```ts
zhaofengliang920817's avatar
zhaofengliang920817 已提交
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
   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 已提交
112
```
D
DCloud_LXH 已提交
113

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
114
- **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 已提交
115
- app-android平台微信支付需要4.11及以上版本
zhaofengliang920817's avatar
zhaofengliang920817 已提交
116
- app-ios平台微信支付需要4.18及以上版本
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
117

W
wanganxp 已提交
118

D
DCloud_LXH 已提交
119
<!-- UTSAPIJSON.requestPayment.example -->
D
DCloud_LXH 已提交
120

D
DCloud_LXH 已提交
121 122
<!-- UTSAPIJSON.general_type.name -->

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
123
<!-- UTSAPIJSON.general_type.param -->
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
124

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
125 126 127

## 支付provider对象描述

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
128
### UniPaymentAlipayProvider(阿里支付)
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
129

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

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
136
### UniPaymentWxpayProvider(微信支付)
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
137

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
138 139 140 141 142 143
| 名称           | 类型      | 必备 | 默认值  | 描述                                  |
| -------------- | --------- | ---- | ------ | ------------------------------------- |
| id             | string    | 是   | -      | 服务供应商标识                        |
| description    | string    | 是   | -      | 服务供应商描述                        |
| ~~isAppExist~~      | boolean   | 是   | -      | 已废弃,判断服务供应商依赖的App是否安装(仅支持微信支付) |
| isWeChatInstalled     | boolean   | 是    | -      | 判断微信是否安装 |
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
144 145 146



WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
147 148 149 150 151 152 153 154 155
## 自定义支付provider接入到uni API 

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

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

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

那只需要按照下面四个步骤实现即可:
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
156 157 158 159 160 161 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

第一步,在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":{}
        }
      }
    }
  }
```

第四步,打自定义基座

DCloud-yyl's avatar
DCloud-yyl 已提交
197
[完整示例可参考支付宝支付插件的实现源码](https://gitcode.net/dcloud/uni-api/-/tree/master/uni_modules/uni-payment-alipay)
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
198