共计 8284 个字符,预计需要花费 21 分钟才能阅读完成。
基于 React Native 的宝领取插件,反对 iOS/Android。实用于商家在 App 利用中集成支付宝领取性能,商家 APP 调用支付宝提供的 SDK,SDK 再调用支付宝 APP 内的领取模块。如果用户已装置支付宝 APP,商家 APP 会跳转到支付宝中实现领取,领取完后跳回到商家 APP 内,最初展现领取后果。如果用户没有装置支付宝 APP,商家 APP 内会调起支付宝网页领取收银台,用户登录支付宝账户,领取完后展现领取后果。残缺实例 Example | 残缺的接口文档
注意事项
- Android:反对 2.3 及以上的零碎版本运行。
- iOS:iOS 6.0 以上 (蕴含 iOS 6.0)。
- 反对手机零碎:iOS(苹果)、Android(安卓)。
- 调试请留神 支付宝接入利用必须
已审核通过
状态。 - 支付宝开放平台 - 管理中心,签约
APP 领取
和APP 支付宝登录
性能。 - 实用于
react-native >= 0.60+
低版本未测试。 - AlipaySDK 15.7.7 已更新到最新的支付宝 SDK 版本。
装置依赖
yarn add @uiw/react-native-alipay
# react-native version >= 0.60+
$ cd ios && pod install
API
Alipay.alipay
领取
Alipay.alipay: (payInfo: string) => Promise<OrderResult>;
- ⚠️ 留神领取胜利返回后果是一个字符串,返回内容
- ⚠️ 支付宝须要设置
Scheme
和 iOS 增加原生代码,能力反对领取和回弹商家 APP 的性能 - ⚠️ 支付宝
管理中心 - 支付宝开放平台
须要签约APP 领取
import Alipay from '@uiw/react-native-alipay';
// 设置 支付宝 URL Schemes,要表述他是宇宙唯一性,能够应用 `bundle Identifier`
// scheme = `alipay` + `APPID`,`APPID` 为支付宝调配给开发者的利用 ID
Alipay.setAlipayScheme(scheme);
// ⚠️ 目前不可用,设置支付宝沙箱环境,仅 Android 反对
// Alipay.setAlipaySandbox(isSandbox);
async function aliPay() {
// 支付宝端领取
// payInfo 是后盾拼接好的领取参数
// return_url=
const payInfo = 'alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2021001172656340&biz_content=%7B%22out_trade_no%22%3A%221111112222222%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221234%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%7D&charset=UTF-8&format=json&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fane.boshu.ltd%2Fowner%2Fpay%2Fapi%2FownerPay%2Fcallback&sign=oUQmGtkv8mrhJ0YwHl9%2FfxMcoLACWuSFKiMTC4Id8nc%2FZVvDQ6MLQq5hhtEN03Qn1%2BAtzTAaofE8nNixdroxOek2l5YtOAcYcXVYlJIyogN%2B22erN2NpDTWJ7tQTKgYFDJLRiG0DZJaxfADhUUF6UR9kdA8omoXKLDlP17ZPUs5Jr4aKv5HJtH5C53ui7PbmyWYg934L4UDC2F%2F9pPQlRwwDeE1SAaV3HW9Dt83kK52o8%2FlChXdotbFdAvH0d4qYGhpEYU5sepj9xiOMyL9aC4pMXW9INYLLGbvtqtlRchZTAfH5yji6nqqQm9KKMmcVrWdBDLyjFVNpejq1UjbJBw%3D%3D&sign_type=RSA2×tamp=2020-07-09+12%3A16%3A16&version=1.0';
const resule = await Alipay.alipay(payInfo);
console.log('alipay:resule-->>>', resule);
}
订单详情 payInfo
编码前的数据
alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=xxxxxxxxxxxxx&biz_content={"out_trade_no":"123123123123123", "total_amount":"0.01", "subject":"1234", "product_code":"QUICK_MSECURITY_PAY"}&charset=UTF-8&format=json&method=alipay.trade.app.pay¬ify_url=http://ane.boshu.ltd/owner/pay/api/ownerPay/callback&return_url=uiwjspay://&sign=re/+2SICQggOUjfxl7MtP/qzir2e+LdH4m+02gDcw0fkByO5MqXW/9bmXw+c4RMqo835OAjMZs7s966ZuDx2PB+hO0tJ/bzdHLLqYlBeCcETkrfwRx+AFZNgzsCn75eRCA7GONH35BpfSeGkQUZ+vNXftqd6hWaa7m/MhQYrjQcV98IVJM+UR67Gj68c+LM586cnk0+rbj8zoos6tCvN8c3xx5UaCobzw4Ogf0PWZ7PZROTU9w2gtoxFfOC5d5slN3laaAXVjAxSf9JCNs8q95fDbzpbmstQOuPgGHkASkd/beH0F8eqTVv8gW1ZTo5v/d/E2wSDGV1DciaEnCroTw==&sign_type=RSA2×tamp=2020-07-09 09:50:41&version=1.0
订单详情 payInfo
编码的数据
alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=xxxxxxxxxxxxx&biz_content=%7B+%22out_trade_no%22%3A%22123123123123123%22%2C+%22total_amount%22%3A%220.01%22%2C+%22subject%22%3A%221234%22%2C+%22product_code%22%3A%22QUICK_MSECURITY_PAY%22+%7D&charset=UTF-8&format=json&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fane.boshu.ltd%2Fowner%2Fpay%2Fapi%2FownerPay%2Fcallback&return_url=uiwjspay%3A%2F%2F&sign=re%2F%2B2SICQggOUjfxl7MtP%2Fqzir2e%2BLdH4m%2B02gDcw0fkByO5MqXW%2F9bmXw%2Bc4RMqo835OAjMZs7s966ZuDx2PB%2BhO0tJ%2FbzdHLLqYlBeCcETkrfwRx%2BAFZNgzsCn75eRCA7GONH35BpfSeGkQUZ%2BvNXftqd6hWaa7m%2FMhQYrjQcV98IVJM%2BUR67Gj68c%2BLM586cnk0%2Brbj8zoos6tCvN8c3xx5UaCobzw4Ogf0PWZ7PZROTU9w2gtoxFfOC5d5slN3laaAXVjAxSf9JCNs8q95fDbzpbmstQOuPgGHkASkd%2FbeH0F8eqTVv8gW1ZTo5v%2Fd%2FE2wSDGV1DciaEnCroTw%3D%3D&sign_type=RSA2×tamp=2020-07-09+09%3A50%3A41&version=1.0
- ⚠️ 后盾 SDK 依据所有数据生成
sign
,倡议通过 API 拿到这个数据,拼接数据会报错。 - ⚠️
out_trade_no
订单 id 和sign
签名 是惟一的,每次不一样,须要后盾生成。
领取返回后果,支付宝返回后果参数阐明:
{"result": "{\"alipay_trade_app_pay_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"app_id\":\"2021001172656340\",\"auth_app_id\":\"2021001172656340\",\"charset\":\"UTF-8\",\"timestamp\":\"2020-07-08 21:30:14\",\"out_trade_no\":\"123123213123214\",\"total_amount\":\"0.01\",\"trade_no\":\"2020070822001414841426413774\",\"seller_id\":\"2088421915791034\"},\"sign\":\"LY7wCsNLp+QnDqCq6VelY/RvyK7ZGY8wsXoKvS+Or7JjONLDUx5P6lDgqRKkpkng7br3y6GZzfGKaZ88Tf4eMnBMKyqU+huR2Um47xUxP383njvHlxuQZsSTLQZRswy4wmb/fPkFfvyH6Or6+oj0eboePOTu63bNr+h03w0QnP4znuHpfRuoVgWpsYh/6B1DL+4xfWRKJ21zm1SV9Feo9RWqnyTaGZyFVi6IKge0dUCYs9hXju95fOUVUOx5YflOFtSEnZafY9Ls4FCRQE1ANkjaKiKIE0+c4c4sEVEf/9Dwh88N+aSQOoLT+AV4RpjMoA8hF2k+vv2OKNeqr6SYGQ==\",\"sign_type\":\"RSA2\"}",
"resultStatus": "9000",
"memo": ""
}
Alipay.authInfo
登录受权
Alipay.authInfo: (authInfoStr: string) => Promise<AuthResult>
;
- ⚠️ 留神受权胜利返回后果是一个字符串,返回内容
- ⚠️ 支付宝须要设置
Scheme
和 iOS 增加原生代码,能力反对验证回弹商家 APP 的性能 - ⚠️ 支付宝
管理中心 - 支付宝开放平台
须要签约APP 支付宝登录
import Alipay from '@uiw/react-native-alipay';
// 设置 支付宝 URL Schemes,要表述他是宇宙唯一性,能够应用 `bundle Identifier`
// scheme = `alipay` + `APPID`,`APPID` 为支付宝调配给开发者的利用 ID
Alipay.setAlipayScheme(scheme);
async function authInfo() {
// 支付宝端受权验证
// authInfoStr 是后盾拼接好的验证参数
const authInfoStr = 'app_name=mc&auth_type=AUTHACCOUNT&apiname=com.alipay.account.auth&biz_type=openservice&product_id=APP_FAST_LOGIN&scope=kuaijie&pid=2088421915791034&target_id=15946456110003465&app_id=2021001172656340&sign_type=RSA2&sign=keluG28qbbLwAcSDI4VmCNOGHJoF3xgpVeqXu1nCBCYo%2FlYYGe00fTfV9L4G73Sk7%2B4IwK%2BZV8IL%2F04cVtk6SR74lKAR3rYOoUdQ09ZrZFuQoUkO0vekajhp75IDQIg6PedCyY0SjFTqrHlH%2FImscBwitxrlSc9YbN7uW0gY34K8t7v8NhDoqzKJeoIz43UxF5U1DpUA1ISBVxwO7du1t6rYltsRhReayPS3hnvmwYSKQZUEgBvJ%2BT2XdyCaz%2FdGV907lYagPp1Oxkoaj%2FvW5NjNsRnid7vH944CoFj9XtBK%2FNTk2tBPTHFxYRQTEG1PkgkBohGpAWOFGGOuapH0ag%3D%3D';
const resule = await Alipay.authInfo(authInfoStr);
// resule => success=true&auth_code=9c11732de44f4f1790b63978b6fbOX53&result_code=200&alipay_open_id=20881001757376426161095132517425&user_id=2088003646494707
console.log('authInfo:resule-->>>', resule);
}
受权返回后果,支付宝返回后果参数阐明:
{
"resultStatus": "9000",
"memo": "解决胜利",
"result": "success=true&result_code=200&app_id=202100117265&auth_code=8b6e5581b85WX84&scope=kuaijie&alipay_open_id=20881029919664670&user_id=20880025&target_id=15946456110003465"
}
Alipay.getVersion
获取 SDK 版本
Alipay.getVersion: () => Promise<string>;
import Alipay from '@uiw/react-native-alipay';
async function getVersion() {const version = await Alipay.getVersion();
console.log('version:', version);
}
支付宝返回利用 iOS 设置
- ⚠️ Android 端不须要做任何设置。
- ⚠️ 如果用户从
支付宝 App
跳转到商家 APP
,是通过零碎性能切换,而不是通过支付宝 APP
功能键返回商家 APP
,回调函数是不起作用的,可通过AppState.addEventListener
监听事件申请后盾 API,来优化这一用户体验。
- 在代码中设置支付宝
URL Schemes
,上面实例uiwjspay
是定义的scheme
,你也能够定义为alipay
+appid
,appid
为支付宝调配给开发者的利用 ID,用来表述scheme
唯一性。
Alipay.setAlipayScheme('uiwjspay');
- 在申请领取的
payInfo
中必须蕴含return_url=uiwjspay://
,return_url
的值为定义的scheme
=>uiwjspay://
,才会返回支付宝订单领取状态后果
// payInfo 是后盾拼接好的领取参数,这个参数必须蕴含 `return_url=uiwjspay://`
Alipay.alipay(payInfo, (res)=>console.log(res))
- 用的
URL Schemes
列为白名单,在ios/< 利用名称 >/Info.plist
中增加
<key>LSApplicationQueriesSchemes</key>
<array>
<string>alipay</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string></string>
<key>CFBundleURLSchemes</key>
<array>
<string>uiwjspay</string>
</array>
</dict>
</array>
- 批改
ios/< 利用名称 >/AppDelegate.m
增加下列代码:
#import <React/RCTLinkingManager.h>
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [RCTLinkingManager application:application openURL:url
sourceApplication:sourceApplication annotation:annotation];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
{return [RCTLinkingManager application:application openURL:url options:options];
}
命令测试
- iOS:
xcrun simctl openurl booted uiwjspay://
- Android:
adb shell am start -W -a android.intent.action.VIEW -d "uiwjspay://test/router" com.uiwjspay
错误处理
[NetworkInfo] Signal strength query returned error: Error Domain=NSPOSIXErrorDomain Code=13 "Permission denied", descriptor: <CTServiceDescriptor 0x283317100, domain=1, instance=1>
在 Product
-> Scheme
-> Edit Scheme
-> Run
-> Arguments
-> Environment Variables
增加 OS_ACTIVITY_MODE
disable
其它
以后工程基于 @brodybits/create-react-native-module 初始化。
npx create-react-native-module --package-identifier com.uiwjs --object-class-name RNAlipay --generate-example Alipay --example-react-native-version 0.63.0 --module-name @uiw/react-native-alipay --github-account uiwjs --author-name "Kenny Wong" --author-email "wowohoo@qq.com"
开发
cd example # 进入实例 example 工程,根目录不须要装置,会引发谬误
yarn install # 装置依赖
cd ios # 进入 example/ios 目录装置依赖
pod instll # 装置依赖
相干连贯
- 支付宝:生成秘钥指南
- 支付宝:SDK 下载地址,以后应用的是 AlipaySDK 15.7.9
- 支付宝:客户端调试工具及应用教程
- 支付宝:领取,接入前筹备
- 支付宝:完整版受权 SDK 调用办法
- 支付宝:异步告诉错误码: IllRet
正文完
发表至: react-native
2020-07-30