Coder Social home page Coder Social logo

react-native-alipay's Introduction

react-native-alipay

NPM Version Dependency Status Build Status License

Alipay SDK for React Native. Support mobile webpage url payment. Support RN >= 0.47.

Native AlipaySDK library (download page):

  • iOS: v15.5.9 (2018.11.26)
  • Android: v15.5.9 (2018.11.26)

Features

Requirement

  • React Native >= 0.20
  • iOS >= 7.0
  • Android >= 4.4 (API 19)

Getting started

$ yarn add @0x5e/react-native-alipay

Native module installation

API Documentation

Alipay.authWithInfo(infoStr)

Returns object with following fields:

field type description
resultStatus String See Response code description
result String Result data in query string format
memo String Reserved field, nothing

The result data has following fields:

field type description
success Boolean true if succeed
result_code String Result code
auth_code String Authorization code
user_id String User id

The result_code description:

code description
200 业务处理成功,会返回authCode
202 系统异常,请稍后再试或联系支付宝技术支持
1005 账户已冻结,如有疑问,请联系支付宝技术支持

Example code:

import QueryString from 'query-string';
import Alipay from '@0x5e/react-native-alipay';

// 快捷登录授权
try {
  let infoStr = 'apiname=com.alipay.account.auth&method=alipay.open.auth.sdk.code.get&app_id=xxxx&app_name=mc&biz_type=openservice&pid=xxxx&product_id=APP_FAST_LOGIN&scope=kuaijie&target_id=xxxx&auth_type=AUTHACCOUNT&sign_type=RSA2&sign=xxxx'; // get from server, signed
  let response = await Alipay.authWithInfo(infoStr);
  console.info(response);

  let { resultStatus, result, memo } = response;
  let { success, result_code, auth_code, user_id } = QueryString.parse(result);

  // TODO: ...

} catch (error) {
  console.error(error);
}

Alipay.setAlipaySandbox(isSandbox)

  • isSandbox {boolean} Whether to open sandbox. Must be payed before use. See 使用沙箱环境

Alipay.pay(orderStr)

Returns object with following fields:

field type description
resultStatus String See Response code description
result String Result data in json string format
memo String Reserved field, nothing

The result data has following fields:

field type description
code String 结果码,具体见公共错误码
msg String 处理结果的描述,信息来自于code返回结果的描述
app_id String 支付宝分配给开发者的应用Id
out_trade_no String 商户网站唯一订单号
trade_no String 该交易在支付宝系统中的交易流水号
total_amount String 该笔订单的资金总额,单位为RMB-Yuan
seller_id String 收款支付宝账号对应的支付宝唯一用户号
charset String 编码格式
timestamp String 时间

Example code:

import Alipay from '@0x5e/react-native-alipay';

// APP支付
try {
  // 打开沙箱
  Alipay.setAlipaySandbox(true)
  let orderStr = 'app_id=xxxx&method=alipay.trade.app.pay&charset=utf-8&timestamp=2014-07-24 03:07:50&version=1.0&notify_url=https%3A%2F%2Fapi.xxx.com%2Fnotify&biz_content=%7B%22subject%22%3A%22%E5%A4%A7%E4%B9%90%E9%80%8F%22%2C%22out_trade_no%22%3A%22xxxx%22%2C%22total_amount%22%3A%229.00%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%7D&sign_type=RSA2&sign=xxxx'; // get from server, signed
  let response = await Alipay.pay(orderStr);
  console.info(response);

  let { resultStatus, result, memo } = response;
  let { code, msg, app_id, out_trade_no, trade_no, total_amount, seller_id, charset, timestamp } = JSON.parse(result);

  // TODO: ...

} catch (error) {
  console.error(error);
}

Alipay.payInterceptorWithUrl(h5PayUrl)

  • h5PayUrl {String} The url string of mobile webpage payment. You may get it from webview. See document for detail.

Returns object with following fields:

field type description
resultCode String 返回码
returnUrl String 支付结束后应当跳转的url地址

Example code:

import Alipay from '@0x5e/react-native-alipay';

// 手机网站转APP支付
try {
  let h5PayUrl = 'https://wappaygw.alipay.com/service/rest.htm?_input_charset=utf-8&format=xml&partner=xxxx&req_data=%3Cauth_and_execute_req%3E%3Crequest_token%3Exxxx%3C%2Frequest_token%3E%3C%2Fauth_and_execute_req%3E&sec_id=MD5&service=alipay.wap.auth.authAndExecute&v=2.0&sign=xxxx'; // get from webview, signed
  let { resultCode, returnUrl } = await Alipay.payInterceptorWithUrl(h5PayUrl);
  console.info(resultCode, returnUrl);
} catch (error) {
  console.error(error);
}

Alipay.sign(object, privateKey)

If you want to do client side signature instead of server side (not recommend), you can use this.

  • object {Object} Object to be signed. The object.sign_type can specify RSA (default) or RSA2.
  • privateKey {String} Private key in PKCS#1 or PKCS#8 format.

Note: PKCS#1 private key should have wrapped with -----BEGIN RSA PRIVATE KEY----- and -----END RSA PRIVATE KEY----- PKCS#8 private key should have wrapped with -----BEGIN PRIVATE KEY----- and -----END PRIVATE KEY-----

Returns The query string with signature. See Process of signature for detail.

Example code:

import Alipay from '@0x5e/react-native-alipay';

// 签名
let params = {
  app_id: 2183,
  biz_content: '{"scopes":["auth_base"],"state":"init"}',
  method: 'alipay.user.info.auth',
  timestamp: '2017-10-13 00:00:00',
  version: '1.0',
};
let privateKey = '-----BEGIN RSA PRIVATE KEY-----\n' + ... + '\n-----END RSA PRIVATE KEY-----';
let signedQuery = Alipay.sign(params, privateKey);
console.info(signedQuery); // app_id=2183&biz_content=%7B%22scopes%22%3A%5B%22auth_base%22%5D%2C%22state%22%3A%22init%22%7D&method=alipay.user.info.auth&sign_type=RSA&timestamp=2017-10-13%2000%3A00%3A00&version=1.0&sign=xxxx

Response code description

code description
9000 操作成功
8000 正在处理中
4000 操作失败
5000 重复请求
6001 用户中途取消
6002 网络连接出错

react-native-alipay's People

Contributors

0x5e avatar a-kylin avatar evianzhow avatar liaoyinglong avatar linyuhong avatar yazhoumiao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

react-native-alipay's Issues

Android Studio 无法加载这个module

Compilation is not supported for following modules: @0x5e_react-native-alipay. Unfortunately you can't have non-Gradle Java modules and Android-Gradle modules in one project.

The binary file 'name.app/react-native-alipay/ios/libAlipaySDK.a' is not permitted.

The binary file 'name.app/react-native-alipay/ios/libAlipaySDK.a' is not permitted.
Your app can't contain standalone executables or libraries, other than a valid CFBundleExecutable of supported bundles. 
Refer to the Bundle Programming Guide at

image

IOS运行模拟器和打包ipa都没问题,上传app store的时候报了这个错。
这是那里有问题?求助大佬

在react-native >= 0.60.2中,Android如果启用Hermes引擎会导致程序崩溃

image

如上图所示,原因是包依赖中的jsrsasign使用了过时的API:RegExp.prototype.compile ,Hermes已经不再支持

react-native-alipay: https://github.com/0x5e/react-native-alipay/blob/master/index.js#L3
jsrsasign: https://github.com/kjur/jsrsasign/blob/d282c71cee92000c4807bcbf2212fedf3f22bd84/src/rsasign-1.2.js#L24

临时解决方案:在 node_modules/@0x5e/react-native-alipay/index.js 把jsressign和Alipay.sign删除,我没有在客户端中进行签名(你也不应该这样做),所以删除这个方法也不会造成影响

补充:如果在开发模式中开启Debug JS Remotely,这个错误不会发生,很奇怪

安卓编译错误

"react": "16.3.1",
"react-native": "0.55.3",

Dex: Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Lcom/ta/utdid2/b/a/a;
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Lcom/ta/utdid2/b/a/a;
        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:502)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
        at com.android.dx.command.dexer.Main.run(Main.java:277)
        at com.android.dx.command.dexer.Main.main(Main.java:245)
        at com.android.dx.command.Main.main(Main.java:106)
    
:app:transformClassesWithDexForDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: java.lang.UnsupportedOperationException

Manifest merger failed

Manifest merger failed : Attribute application@allowBackup value=(false) from AndroidManifest.xml:15:50-77
is also present at [:react-native-alipay] AndroidManifest.xml:17:18-44 value=(true).

测试了一下Develop分支的组件,出现问题。(_OBJC_CLASS_$_UTDevice)

环境:
React Native Environment Info:
System:
OS: macOS 10.14
CPU: x64 Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
Memory: 898.12 MB / 16.00 GB
Shell: 3.2.57 - /bin/bash
Binaries:
Node: 8.12.0 - /usr/local/bin/node
Yarn: 1.12.1 - /usr/local/bin/yarn
npm: 6.4.1 - /usr/local/bin/npm
Watchman: 4.9.0 - /usr/local/bin/watchman
SDKs:
iOS SDK:
Platforms: iOS 12.1, macOS 10.14, tvOS 12.1, watchOS 5.1
IDEs:
Xcode: 10.1/10B61 - /usr/bin/xcodebuild
npmPackages:
react: 16.6.3 => 16.6.3
react-native: 0.57.7 => 0.57.7
npmGlobalPackages:
react-native-cli: 2.0.1
react-native-git-upgrade: 0.2.7
react-native-rename: 2.3.1

在清空node_modules和缓存后,运行React-Native run-ios会出现下面的错误:
Undefined symbols for architecture x86_64:

"OBJC_CLASS$_UTDevice", referenced from:
objc-class-ref in libRCTAlipay.a(libAlipaySDK.a)

ld: symbol(s) not found for architecture x86_64。

麻烦看看是哪里的问题!

element must be a direct child of the <application>

node_modules/@0x5e/react-native-alipay/android/src/main/AndroidManifest.xml:11: Error: The element must be a direct child of the element [WrongManifestParent]
<activity
^

Explanation for issues of type "WrongManifestParent":
The element should be defined as a direct child of the
tag, not the tag or an tag. Similarly,
a tag must be declared at the root level, and so on. This check
looks for incorrect declaration locations in the manifest, and complains if
an element is found in the wrong place.

http://developer.android.com/guide/topics/manifest/manifest-intro.html

2 errors, 0 warnings

ios Alipay.pay(orderStr)

取消,或是支付成功,无法返回 应用
"react-native": "0.57.4",
"@0x5e/react-native-alipay": "^0.2.5",

包名冲突了

大神,与aliyun-oss-react-native包名冲突导致编译报错了。手动修改其中某个包名就正常编译了

[Android] Error:(14) error: unknown element <activity> found.

Android Build之后,app/build/intermediates/manifests/full/debug/AndroidManifest.xml文件:

这两个activity似乎出现在错误的地方

    <activity
        android:name="com.alipay.sdk.app.H5PayActivity"
        android:configChanges="orientation|keyboardHidden|navigation|screenSize"
        android:exported="false"
        android:screenOrientation="behind"
        android:windowSoftInputMode="adjustResize|stateHidden" >
    </activity>
    <activity
        android:name="com.alipay.sdk.app.H5AuthActivity"
        android:configChanges="orientation|keyboardHidden|navigation"
        android:exported="false"
        android:screenOrientation="behind"
        android:windowSoftInputMode="adjustResize|stateHidden" >
    </activity>

完整的文件内容:

<uses-sdk
    android:minSdkVersion="16"
    android:targetSdkVersion="22" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

<activity
    android:name="com.alipay.sdk.app.H5PayActivity"
    android:configChanges="orientation|keyboardHidden|navigation|screenSize"
    android:exported="false"
    android:screenOrientation="behind"
    android:windowSoftInputMode="adjustResize|stateHidden" >
</activity>
<activity
    android:name="com.alipay.sdk.app.H5AuthActivity"
    android:configChanges="orientation|keyboardHidden|navigation"
    android:exported="false"
    android:screenOrientation="behind"
    android:windowSoftInputMode="adjustResize|stateHidden" >
</activity>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<application
    android:name="com.cagestsapp.MainApplication"
    android:allowBackup="true"
    android:debuggable="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.cagestsapp.MainActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>

`libRCTAlipay.a` binary build failed, need update

undef: _OBJC_CLASS_$_UTDevice
Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_UTDevice", referenced from:
      objc-class-ref in libRCTAlipay.a(libAlipaySDK.a)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Fixed according to these steps: https://my.oschina.net/u/1583729/blog/790413

Newer binary MD5:

openssl md5 /Users/_/Downloads/WS_APP_PAY_SDK_BASE_2.0/Demo/iOSDemo_2.0\(SDK_15.5.3\)/AlipaySDK.framework/AlipaySDK
MD5(/Users/_/Downloads/WS_APP_PAY_SDK_BASE_2.0/Demo/iOSDemo_2.0(SDK_15.5.3)/AlipaySDK.framework/AlipaySDK)= c49fc1c0db8945f084506af5902abc7a

alipaySdk

Could not find :alipaySdk-15.5.9-20181123210601:.

iOS AliPay.apy(str)闪退

Simulator Screen Shot - iPhone X - 2019-10-14 at 15 10 29

const payStr =
'app_id=2019101268290801' +
'&method=alipay.trade.app.pay' +
'&format=json' +
'&charset=UTF-8' +
'&sign_type=RSA2' +
'&sign=APho46HqIR1P9rImcFBRsEjrZStIWzMrVQbS%2FMFhrLqvpwJsTdYRx3N87h78LzX8v8EwK%2FQgljhqhYIW3M8dcx73ceM4ViCmjBmlWcGQKx%2Bbw8a1Lv2tls2W881ZK80%2FyyxVr%2Bwg2zrMEKU5PpJENA7vqaT0IzNA0m1uuIA5l1m3A1Tr2gfCMo44OVWVUi9L1sJkQ26ByJVbnXEkckLmvaQxvp7PFMTV2gKH6RJUw%2FgIOWKAnfjKtAcqwNelbpBUSqJHu3yqqfzBKC%2FuYy1qJfaO%2BUAw1iPmobzcASAY8BVM2ObAQ6L915SJi%2FT8cu%2FVu%2FBesarvhFzV5cbu4G4%2FJw%3D%3D' +
'&timestamp=2019-10-14+14%3A45%3A16' +
'&version=1.0' +
'&notify_url=http%3A%2F%2F192.168.1.19%2FappAlipay%2Fzfbpay' +
'&biz_content=%7B%22out_trade_no%22%3A%2212019101414451581785043187954135%22%2C%22subject%22%3A%22%E6%B9%96%E5%8C%97%E7%A7%BB%E5%8A%A8%E8%AF%9D%E8%B4%B910%E5%85%83%E7%9B%B4%E5%85%85%22%2C%22timeout_express%22%3A%2230m%22%2C%22total_amount%22%3A%2210%22%7D';
const result = await Alipay.pay(payStr);

安卓打包之后安装闪退

您好,我遇到了下面的问题:
iOS Debug和打包之后安装运行都没有问题;
安卓 Debug模式下没有问题,安卓打包安装之后打开闪退;
有什么解决方案吗?

When subject content contains '&' , alipay can't be successfully called.

dependence:

 "@0x5e/react-native-alipay": "^0.2.6",
"react-native": "0.60.4",

surmise:

An URL (Uniform resource locator) is a set of strings to define a location in the World Wide Web (www). It can also be used to pass information to the destination. Any word after the question mark (?) in a URL is considered to be a parameter which can hold values. The value for the corresponding parameter is given after the symbol "equals" (=). Multiple parameters can be passed through the URL by separating them with multiple "&".

When subject content contains '&' ,it will be consider as parameters. So alipay cannot be successfully called. Hope someone can fix this issue.

Android - build failure when using multidex

Hey @0x5e

We are using multidex in our android build, and the after following the documentation we are getting the this error:

* What went wrong:
Execution failed for task ':app:transformClassesWithMultidexlistForDebug'.
> com.android.build.api.transform.TransformException: Error while generating the main dex list.
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithMultidexlistForDebug'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:103)

Do you have any suggestion what might go wrong here?

Thank you

你这个是用于APP支付吗?

为什么安卓调用支付宝一直返回ALI40247系统繁忙的错误,支付宝那边一直说我的请求参数没什么问题,我怀疑是不是你这个插件的问题?

RN 0.57.8 出错 This browser lacks typed array (Uint8Array) support which is required by buffer v5.x. Use buffer v4.x

RN 0.57.8 出错 ,这个错误也只在未开启调试和打包后出问题,打开调试的情况下是没问题的。看了代码。并没有抛出异常,只是做了console.error提示而已,不知道为什么会出异常提示

错误信息:This browser lacks typed array (Uint8Array) support which is required by buffer v5.x. Use buffer v4.x

找到相关问题链接,但是global.Buffer.TYPED_ARRAY_SUPPORT = false 这个方式是不可行的
https://stackoverflow.com/questions/57622618/react-native-this-browser-lacks-typed-array-uint8array-support-which-is-req

除了升级RN到0.60,还有什么其他方法可用?请高手指教!

ios build failed

In XCode, in the project navigator, right click Libraries -> Add Files to [your project's name], go to node_modules/@0x5e/react-native-alipay and add RCTAlipay.xcodeproj 添加后build failed

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.