热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一步一步将支付宝集成react-native应用

腾讯官方前端NEXT学位,免费试学限时拿!腾讯技术总监亲研课程,带你从零到一,玩转前端!https:ke.qq.comnextindex.html现在很多APP都有
腾讯官方前端NEXT学位,免费试学限时拿!腾讯技术总监亲研课程,带你从零到一,玩转前端!https://ke.qq.com/next/index.html

现在很多 APP 都有集成第三方支付平台的需求,用来支付自己的产品,但是官方一般都没有介绍如何集成到 react-native 的应用中,本篇文章将基于官方提供的集成文档,介绍如何将支付宝集成到 react-native 应用中。

场景介绍

适用于商家在App应用中集成支付宝支付功能。
商家APP调用支付宝提供的SDK,SDK再调用支付宝APP内的支付模块。如果用户已安装支付宝APP,商家APP会跳转到支付宝中完成支付,支付完后跳回到商家APP内,最后展示支付结果。如果用户没有安装支付宝APP,商家APP内会调起支付宝网页支付收银台,用户登录支付宝账户,支付完后展示支付结果。
目前支持手机系统有:iOS(苹果)、Android(安卓)。

集成SDK

Android

  1. 将alipaySdk-xxxxxxxx.jar包放入android/app/libs目录下,如下图。
  2. 将libs目录下的alipaySDK-xxxxxxxx.jar导入,在android/app/build.gradle里添加如下代码:

    dependencies {
        ......
        compile files('libs/alipaySdk-20170725.jar')
        ......
    }
    
  3. android/app/src/AndroidManifest.xml文件里面添加声明:

    
    <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.INTERNET" />
    <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" />
    
  4. android/app/proguard-rules.pro添加混淆规则

    -keep class com.alipay.android.app.IAlixPay{*;}
    -keep class com.alipay.android.app.IAlixPay$Stub{*;}
    -keep class com.alipay.android.app.IRemoteServiceCallback{*;}
    -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
    -keep class com.alipay.sdk.app.PayTask{ public *;}
    -keep class com.alipay.sdk.app.AuthTask{ public *;}
    -keep class com.alipay.sdk.app.H5PayCallback {
        ;
        ;
    }
    -keep class com.alipay.android.phone.mrpc.core.** { *; }
    -keep class com.alipay.apmobilesecuritysdk.** { *; }
    -keep class com.alipay.mobile.framework.service.annotation.** { *; }
    -keep class com.alipay.mobilesecuritysdk.face.** { *; }
    -keep class com.alipay.tscenter.biz.rpc.** { *; }
    -keep class org.json.alipay.** { *; }
    -keep class com.alipay.tscenter.** { *; }
    -keep class com.ta.utdid2.** { *;}
    -keep class com.ut.device.** { *;}
    
  5. com.xx.xx创建包名alipay

  6. 编写 Module,在com.xx.xx.alipay包下创建AlipayModule.java,代码如下:

    package com.xx.xx.alipay;
    
    import com.alipay.sdk.app.PayTask;
    import com.facebook.react.bridge.Arguments;
    import com.facebook.react.bridge.Promise;
    import com.facebook.react.bridge.ReactApplicationContext;
    import com.facebook.react.bridge.ReactContextBaseJavaModule;
    import com.facebook.react.bridge.ReactMethod;
    import com.facebook.react.bridge.WritableMap;
    import java.util.Map;
    
    public class AlipayModule extends ReactContextBaseJavaModule {
    
      public AlipayModule(ReactApplicationContext reactContext) {
        super(reactContext);
      }
    
      @Override
      public String getName() {
        return "Alipay";
      }
    
      @ReactMethod
      public void pay(final String orderInfo, final Promise promise) {
        Runnable payRunnable = new Runnable() {
          @Override
          public void run() {
            WritableMap map = Arguments.createMap();
            PayTask alipay = new PayTask(getCurrentActivity());
            Map result = alipay.payV2(orderInfo,true);
            for (Map.Entry entry: result.entrySet())
              map.putString(entry.getKey(), entry.getValue());
            promise.resolve(map);
          }
        };
        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
      }
    
    }
    
  7. 编写 Package,在com.xx.xx.alipay包下创建AlipayPackage.java,代码如下:

    package com.xx.xx.alipay;
    
    import com.facebook.react.ReactPackage;
    import com.facebook.react.bridge.NativeModule;
    import com.facebook.react.bridge.ReactApplicationContext;
    import com.facebook.react.uimanager.ViewManager;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class AlipayPackage implements ReactPackage {
    
      @Override
      public List createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
      }
    
      @Override
      public List createNativeModules( ReactApplicationContext reactContext) {
        List modules = new ArrayList<>();
        modules.add(new AlipayModule(reactContext));
        return modules;
      }
    
    }
    
  8. 最后在 Android 这边要做的最后一件事就是注册这个模块,在com.xx.xx.MainApplication中注册模块:

    @Override
    protected List getPackages() {
        return Arrays.asList(
            new MainReactPackage(),
            // ...other packages
            new AlipayPackage() // <-- 注册模块
        );
    }
    

iOS

  1. 启动IDE(如Xcode),把iOS包中的压缩文件中以下文件拷贝到项目文件夹下,并导入到项目工程中。
    AlipaySDK.bundle
    AlipaySDK.framework
  2. 在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖:
    • 如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
    • 如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib。
  3. 在项目目录下创建Group Alipay,并创建AlipayMoudle模块,如下图所示:
    2017-12-05-16-24-34
  4. 编写AlipayModule.h代码如下:

    #import 
    #import 
    
    @interface AlipayMoudle : NSObject <RCTBridgeModule>
    @end
    
  5. 编写AlipayModule.m代码如下:

    #import "AlipayMoudle.h"
    #import 
    
    @implementation AlipayMoudle
    
    RCT_EXPORT_METHOD(pay:(NSString *)orderInfo
      resolver:(RCTPromiseResolveBlock)resolve
      rejecter:(RCTPromiseRejectBlock)reject){
      //应用注册scheme,在AliSDKDemo-Info.plist定义URL types
      NSString *appScheme = @"alisdkdemo";
      [[AlipaySDK defaultService] payOrder:orderInfo fromScheme:appScheme callback:^(NSDictionary *resultDic) {
        resolve(resultDic);
      }];
    }
    
    RCT_EXPORT_MODULE(Alipay);
    
    @end
    
  6. 至此,iOS端支付宝SDK集成成功

React-Native

  1. 修改原生代码后,需要重新打包运行程序:

    react-native run-android # 运行Android端
    react-native run-ios # 运行iOS端
    
  2. 编写Alipay.js工具类

    import { NativeModules } from 'react-native';
    export default NativeModules.Alipay;
    
  3. 调用Alipay模块发起支付宝支付:

    import Alipay from './your/path/to/Alipay';
    async pay(params){ // params 为后端提供的参数
      let res = await call(getOrderInfo, params); // 从后端获取签名字串,参考支付接口调用
      let ret = await call(Alipay.pay, res.data); // 调起支付宝,发起支付
      if (ret.resultStatus === '9000') {
        // 支付成功回调
      } else {
        // 支付失败回调
      }
    }
    
  4. 支付接口调用参考支付接口调用和支付请求参数说明,本篇将不做赘述。

后记

后面会继续介绍 react-native 微信支付的集成,相比支付宝集成,微信支付集成会麻烦很多,比如处理回调、应用签名机制、注册scheme等都提高了集成的复杂度。

参考文档

docs.open.alipay.com/204/105296/ App支付Android集成流程
docs.open.alipay.com/204/105295/ App支付iOS集成流程
reactnative.cn/docs/0.50/n… Android调用原生模块
reactnative.cn/docs/0.50/n… iOS调用原生模块


推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
孙衍龙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有