React-Native之iOS集成支付寶支付

支付寶沒有支持RN,所以只能通過在原生封裝支付寶讓RN調用。來一波效果圖:

選擇支付寶支付.png
充值提示.png

在沒有安裝支付寶APP的情況下,跳轉網頁支付寶頁面:

支付寶網頁頁面.png

整體流程:
1.在螞蟻金服開放平臺申請應用
2.原生集成支付寶
3.原生封裝支付寶
4.RN調用參數定義
5.RN調用原生支付寶支付

一.在螞蟻金服開放平臺申請應用
螞蟻金服開發平臺:https://openhome.alipay.com/platform/manageHome.htm
進入應用:

55CCD31C-C591-4570-AE82-226840C54F60.png

按照支付寶文檔要求逐步走創建應用流程(審核需要一天左右):
9E1793DD-9407-4999-9D95-47F1E0DEAA46.png

審核通過之后在接口加簽方式上傳RSA2(SHA256)密鑰(推薦)

添加密鑰.png

進入開發文檔,選擇APP支付:

0012210B-4DC1-4446-AEE4-5BB15D2391E7.png

二:原生集成支付寶
1.導入代碼,進入SDK及DEMO下載,下載含有demo的一項,

646B6C0C-FF0E-41C3-AFC1-0E87DA542C00.png

2.回到進入iOS集成流程,按照文檔一步步集成到xcode中
(1)把兩個包AlipaySDK.bundle,AlipaySDK.framework導入到xcode中
(2)底層依賴庫的添加:項目 --> build phases --> link binary with libraries
在link binary with libraries中點加號,添加上圖中的依賴文件,如下圖所示。

1C97D616-57A4-4C34-9A11-6446B501A9FC.png

(3)導入支付寶iosDemo_2.0中的Order.h和Order.m。之后Build一下

88B58AA3-470D-4D3E-9CF3-973A96E00C88.png

(4)在AppDelegate.m中,引入:

import <AlipaySDK/AlipaySDK.h> 添加下面代理(注意區分是否是iOS9之后)

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
     
    if ([url.host isEqualToString:@"safepay"]) {
        //跳轉支付寶錢包進行支付,處理支付結果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
        }];
    }
    return YES;
}
 
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
    if ([url.host isEqualToString:@"safepay"]) {
        //跳轉支付寶錢包進行支付,處理支付結果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
        }];
    }
    return YES;
}

三.原生封裝支付寶
1.新建一個支付按鈕繼承與UIButton的類(我的是WeChatPayBtn)
在WeChatPayBtn.h中引入頭文件:#import "Order.h",#import <AlipaySDK/AlipaySDK.h>,#import <RCTBridge.h>,#import <RCTConvert.h>,#import <RCTComponent.h>,#import <UIView+React.h>,#import <RCTEventDispatcher.h>并集成

引入文件.png

2.在WeChatPayBtn.m中 doAlipayPay是調用支付寶支付,按鈕點擊方法pay中用到一個代理。WeChatPayBtn的代理是即將要新建的繼承于RCTViewManager的WeChatPayManager, _signedString是與JS通信傳入的參數,下面的第四條RN調用參數定義會介紹

#import "WeChatPayBtn.h"
#import "WXApiManager.h"
#import "WXApiObject.h"
#import "WXApi.h"

@implementation WeChatPayBtn
-(instancetype)initWithFrame:(CGRect)frame{
  if ((self = [super initWithFrame:frame])) {
    [self addTarget:self action:@selector(pay)
   forControlEvents:UIControlEventTouchUpInside];
    [self setBackgroundColor:[UIColor redColor]];
  }
  return self;
}
//調起支付寶支付
- (void)doAlipayPay
{
    NSString *appScheme = @"CloudProcessing";
    NSLog(@"支付寶簽名:%@",_signedString);
    // NOTE: 調用支付結果開始支付
    [[AlipaySDK defaultService] payOrder:_signedString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
      NSLog(@"支付寶支付結果:reslut = %@",resultDic);
    }];
}
//點擊btn時 觸發支付寶支付
-(void)pay{
  if([_delegate respondsToSelector:@selector(ButtonClicked)]){
    [self.delegate ButtonClicked];
  }
  //支付寶支付
  [self doAlipayPay];
}

3.新建新建的繼承于RCTViewManager的WeChatPayManager
注意看WeChatPayManager.h只引入了#import <Foundation/Foundation.h>

WeChatPayManager.h.png

4.WeChatPayManager.m,WeChatPay(重點)js 中會用到。添加標記宏RCT_EXPORT_MODULE()將該模塊導出作為一個組件,實現-(UIView *)view方法,在view方法中初始化了之前建立的WeChatPayBtn。

WeChatPayManager.m.png
#import "WeChatPayManager.h"
#import "WXApi.h"
#import "RCTViewManager.h"
#import "WeChatPayBtn.h"
@interface WeChatPay : RCTViewManager
@property (nonatomic,strong) WeChatPayBtn *bt;
@end

@implementation WeChatPay
RCT_EXPORT_MODULE()
-(UIView *)view{
  _bt = [[WeChatPayBtn alloc]initWithFrame:CGRectMake(20, 250, 200, 40)];
  _bt.delegate = self;
  NSLog(@"進入_we_btn");
  return _bt;
}
@end

原生部分代碼最基本的部分完成了,下面還需要定義參數(作用是從react native 的js傳值給WeChatPayBtn中的支付寶支付簽名_signedString)
四.RN調用參數定義
需要用到的參數是signedString,服務端返回的支付寶訂單加簽,在調用支付寶支付的入參。
1.在WeChatPayBtn.h文件中定義參數signedString

//支付寶簽名
@property (nonatomic,copy) NSString *signedString;

2.WeChatPayManager.m文件 中導出參數 RCT_EXPORT_VIEW_PROPERTY(signedString, NSString)

#import "WeChatPayManager.h"
#import "WXApi.h"
#import "RCTViewManager.h"
#import "WeChatPayBtn.h"
@interface WeChatPay : RCTViewManager<WeChatDelegate>
@property (nonatomic,strong) WeChatPayBtn *bt;
@end

@implementation WeChatPay
RCT_EXPORT_MODULE()
//將參數導出給JS
RCT_EXPORT_VIEW_PROPERTY(signedString, NSString)
-(UIView *)view{
  _bt = [[WeChatPayBtn alloc]initWithFrame:CGRectMake(20, 250, 200, 40)];
  _bt.delegate = self;
  NSLog(@"進入_we_btn");
  return _bt;
}

五.RN調用原生支付寶支付
1.接下來實現JS中的組件封裝與簡單調用。我是在一個JS文件中完成組件封裝和調用。你也可以分組件完成。首先導入原生組件,從導入中取到創建的組件,作為默認的組件導出,以供其他JS調用。這里,我們其實可以直接在其他JS中調用了,但是為了進行參數的封裝,我們也需要將其封裝成一個單獨的組件
js中引入import {requireNativeComponent} from 'react-native',
var PayManage = requireNativeComponent('WeChatPay',WeChatPayMan)
WeChatPay就是在原生中WeChatPayManager.m中定義的, PayManage 是調用原生的組件,

export class WeChatPayMan extends Component {
   //傳遞到原生的屬性
   static propTypes = {
       signedString:PropTypes.string,
   };
   render() {
       return (
           <PayManage {...this.props}/>
       );
   }

   componentDidMount() {
       console.log('支付寶支付JS界面')
   }
}

上面代碼中static propTypes中的signedString是需要傳遞到原生的支付寶加簽

2.封裝組件的調用。下面代碼所示是前面封裝組件的調用,這里我們已經封裝了很多JS需要傳遞給原生的參數, signedString就是原生中調起支付寶支付的簽名(在服務器后臺配置通過網絡請求返回)

<WeChatPayMan
                        style={{marginTop:100,width:width-80,height:40,alignItems:'center',
                            justifyContent:'center',borderRadius:5,backgroundColor:'#35a40c'
                        }}
                        signedString={this.state.signedString}
                        }}
                    >

到這里RN調用iOS原生支付已全部實現完成

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容