React Native (IOS和Android) 支付宝和微信支付集成实战(支付宝Android篇)

序言:React Native无论是在社区和应用程度上,在国内外是十分广泛和普及的。而支付宝和微信在支付模块上都有或多或少的支持,虽然没有完整的Demo,不过在我做过一个相关集成的项目后,在此我把相关的步骤和方法总结出来和大家分享,希望能够帮助大家少走弯路,快速集成。

支付宝——Android集成

 

一、下载客户端SDK并且进行配置

在支付宝官网下载 其SDKhttps://docs.open.alipay.com/54/104509

用Android Studio 打开你项目里的/android,以Project形式展开项目,并且在/app目录下新建文件夹libs(如果没有该文件夹),

将下载的SDK jar包拖入或复制至libs文件夹内,如下图:

接着在 /android/app/build.gradle 内添加依赖, 如下图,注意jar包的名字要统一:

然后修改AndroidManifest.xml文件,添加以下内容:

 
  1. <activity

  2. android:name="com.alipay.sdk.app.H5PayActivity"

  3. android:configChanges="orientation|keyboardHidden|navigation|screenSize"

  4. android:exported="false"

  5. android:screenOrientation="behind"

  6. android:windowSoftInputMode="adjustResize|stateHidden" >

  7. </activity>

  8. <activity

  9. android:name="com.alipay.sdk.app.H5AuthActivity"

  10. android:configChanges="orientation|keyboardHidden|navigation"

  11. android:exported="false"

  12. android:screenOrientation="behind"

  13. android:windowSoftInputMode="adjustResize|stateHidden" >

  14. </activity>

 

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

  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

  3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

  4. <uses-permission android:name="android.permission.READ_PHONE_STATE" />

  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

最后再在proguard-rules.pro文件内末尾处添加以下内容:

 

 
  1. -keep class com.alipay.android.app.IAlixPay{*;}

  2. -keep class com.alipay.android.app.IAlixPay$Stub{*;}

  3. -keep class com.alipay.android.app.IRemoteServiceCallback{*;}

  4. -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}

  5. -keep class com.alipay.sdk.app.PayTask{ public *;}

  6. -keep class com.alipay.sdk.app.AuthTask{ public *;}

  7. -keep class com.alipay.sdk.app.H5PayCallback {

  8. <fields>;

  9. <methods>;

  10. }

  11. -keep class com.alipay.android.phone.mrpc.core.** { *; }

  12. -keep class com.alipay.apmobilesecuritysdk.** { *; }

  13. -keep class com.alipay.mobile.framework.service.annotation.** { *; }

  14. -keep class com.alipay.mobilesecuritysdk.face.** { *; }

  15. -keep class com.alipay.tscenter.biz.rpc.** { *; }

  16. -keep class org.json.alipay.** { *; }

  17. -keep class com.alipay.tscenter.** { *; }

  18. -keep class com.ta.utdid2.** { *;}

  19. -keep class com.ut.device.** { *;}

至此Android配置已经完成,如果你在AndroidManifest.xml下,用Android Studio发现 alipay的 <actvity> 标签是红色未知引用状态,重启Android Studio即可,若还是红色,右键 alipaySdk jar包,选择Add  as library 并且点击OK 即可。
 

 

 

二、编写React Native原生代码

React Native 提供了调用原生代码的方法,具体可以参考官方文档 Native Modules http://facebook.github.io/react-native/docs/native-modules-android.html

首先我们用Android Studio 以Android文件目录格式打开,并且在java/com.app_demo目录下创建alipay package, 并且在其目录下新建PayAction.java和PayResult.java文件, 如下图:

接着调用react native 原生内容,编写方法,PayAction代码如下:

 

 
  1. package com.app_demo.alipay;

  2.  
  3. import android.app.Activity;

  4. import android.text.TextUtils;

  5. import com.alipay.sdk.app.EnvUtils;

  6. import com.alipay.sdk.app.PayTask;

  7. import com.app_demo.MainActivity;

  8. import com.facebook.react.bridge.ReactContextBaseJavaModule;

  9. import com.facebook.react.bridge.Promise;

  10. import com.facebook.react.bridge.ReactApplicationContext;

  11. import com.facebook.react.bridge.ReactMethod;

  12.  
  13. import java.util.Map;

  14.  
  15.  
  16.  
  17. public class PayAction extends ReactContextBaseJavaModule {

  18.  
  19.  
  20. public PayAction(ReactApplicationContext reactContext) {

  21. super(reactContext);

  22. }

  23.  
  24. @Override

  25. public String getName() {

  26. return "PayAction";

  27. }

  28.  
  29. @ReactMethod

  30. public void pay(final String orderInfo, final Promise promise) {

  31. //支付宝沙箱android测试需要调用

  32. //EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);

  33.  
  34. Runnable payRunnable = new Runnable() {

  35. @Override

  36. public void run() {

  37. Activity activty = MainActivity.getActivity();

  38. PayTask alipay = new PayTask(activty);

  39. Map<String, String> result = alipay.payV2(orderInfo, true);

  40. PayResult payResult = new PayResult((Map<String, String>) result);

  41. String resultInfo = payResult.getResult();

  42. String resultStatus = payResult.getResultStatus();

  43. String memo = payResult.getMemo();

  44. try {

  45. if (TextUtils.equals(resultStatus, "9000")) {

  46. promise.resolve(resultInfo);

  47. } else {

  48. promise.reject("error", memo);

  49. }

  50. } catch (Exception e) {

  51. promise.reject("error", e.getMessage());

  52. }

  53.  
  54.  
  55. }

  56. };

  57. Thread payThread = new Thread(payRunnable);

  58. payThread.start();

  59. }

  60.  
  61.  
  62. }

PayResult 代码如下:

 

 

 
  1. package com.app_demo.alipay;

  2.  
  3. import java.util.Map;

  4.  
  5. import android.text.TextUtils;

  6.  
  7. public class PayResult {

  8. private String resultStatus;

  9. private String result;

  10. private String memo;

  11.  
  12. public PayResult(Map<String, String> rawResult) {

  13. if (rawResult == null) {

  14. return;

  15. }

  16.  
  17. for (String key : rawResult.keySet()) {

  18. if (TextUtils.equals(key, "resultStatus")) {

  19. resultStatus = rawResult.get(key);

  20. } else if (TextUtils.equals(key, "result")) {

  21. result = rawResult.get(key);

  22. } else if (TextUtils.equals(key, "memo")) {

  23. memo = rawResult.get(key);

  24. }

  25. }

  26. }

  27.  
  28. @Override

  29. public String toString() {

  30. return "resultStatus={" + resultStatus + "};memo={" + memo

  31. + "};result={" + result + "}";

  32. }

  33.  
  34. /**

  35. * @return the resultStatus

  36. */

  37. public String getResultStatus() {

  38. return resultStatus;

  39. }

  40.  
  41. /**

  42. * @return the memo

  43. */

  44. public String getMemo() {

  45. return memo;

  46. }

  47.  
  48. /**

  49. * @return the result

  50. */

  51. public String getResult() {

  52. return result;

  53. }

  54. }

 

紧接着将该方法暴露出来给React Native 前端使用,即在com.app_demo下创建AlipayReactPackage.java文件,代码如下

 

 
  1. package com.app_demo;

  2.  
  3. import com.app_demo.alipay.PayAction;

  4. import com.facebook.react.ReactPackage;

  5. import com.facebook.react.bridge.NativeModule;

  6. import com.facebook.react.bridge.ReactApplicationContext;

  7. import com.facebook.react.uimanager.ViewManager;

  8.  
  9. import java.util.ArrayList;

  10. import java.util.Collections;

  11. import java.util.List;

  12.  
  13.  
  14. public class AlipayReactPackage implements ReactPackage {

  15.  
  16. @Override

  17. public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {

  18. return Collections.emptyList();

  19. }

  20.  
  21. @Override

  22. public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {

  23. List<NativeModule> modules = new ArrayList<>();

  24.  
  25. modules.add(new PayAction(reactContext));

  26.  
  27. return modules;

  28. }

  29. }

 

然后修改MainActivity里的方法,使MainActivity可以在PayAction中可以获取,修改后代码如下:

 

 
  1. package com.app_demo;

  2.  
  3. import android.app.Activity;

  4. import android.os.Bundle;

  5.  
  6. import com.facebook.react.ReactActivity;

  7. import com.facebook.soloader.SoLoader;

  8.  
  9. public class MainActivity extends ReactActivity {

  10.  
  11. private static Activity mCurrentMainActivity = null;

  12.  
  13. /**

  14. * Returns the name of the main component registered from JavaScript.

  15. * This is used to schedule rendering of the component.

  16. */

  17. @Override

  18. protected String getMainComponentName() {

  19. return "App_Demo";

  20. }

  21.  
  22. @Override

  23. protected void onCreate(Bundle savedInstanceState) {

  24. super.onCreate(savedInstanceState);

  25. mCurrentMainActivity = this;

  26. }

  27.  
  28. public static Activity getActivity() {

  29. Activity activity = mCurrentMainActivity;

  30. return activity;

  31. }

  32. }

接着在MainApplication 里添加刚刚写好的AlipayReactPackage包,代码如下:

 

 
  1. @Override

  2. protected List<ReactPackage> getPackages() {

  3. return Arrays.<ReactPackage>asList(

  4. new AlipayReactPackage(),

  5. new MainReactPackage()

  6. );

  7. }

最后编写React Native Js内容,调用该pay方法:

 

 

 
  1. _alipay = () => {

  2. var payAction = NativeModules.PayAction

  3. //调用支付宝服务端集成的方法,获取订单信息

  4. axios.post('http://192.168.1.45:3000/alipay/pay').then(({ data }) => {

  5. return payAction.pay(data)

  6. }).then((res) => {

  7. alert(res)

  8. //此处处理支付成功的方法

  9. console.log(res)

  10. }).catch((err) => {

  11. alert(err)

  12. console.log(err)

  13. })

  14.  
  15. }

  16.  
  17. render(){

  18. return <View><Button title='Alipay 支付' onPress={this._alipay} /></View>

  19. }


至此支付宝Android端的集成就全部完成了,总体来说,比较简单,代码也很清晰,建议在开发过程中,多以真实App的环境进行开发,因为沙箱偶尔会出现网络或者其他未知的问题,而如果在真实环境中,也会出现各种问题,那就绝对是你代码的问题,例如签名错误。

转载链接:https://blog.csdn.net/likeconan123/article/details/78999482

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值