React Native iOS 集成支付宝支付功能--回调问题

来源:互联网 发布:科比各年数据统计 编辑:程序博客网 时间:2024/06/05 10:31

React Native iOS 集成支付宝支付功能–回调问题

首先 附上GitHub地址0x5e/react-native-alipay

react-native-alipay Git有不少版本 当你使用npm时需要多加注意了

之前打算用react-native-yunpeng-alipay 和 react-native-alipay 但是继承了进去后 编译成功了 ,在JS里面一直不能拿到方法(以后有机会还会再试的),

后来就找到了$ yarn add @0x5e/react-native-alipay ,集成后可以jump 到支付宝支付并且支付成功,但是JS的回调一直不走,Xcode里面的回调是有拿到返回值的,

最终的解决办法是参考的react-native-alipay 里面的解决方法:

这里写图片描述

在RCTAlipay.m 中:

#import "RCTAlipay.h"#import <AlipaySDK/AlipaySDK.h>static NSString *const kOpenURLNotification = @"RCTOpenURLNotification";@implementation RCTAlipay{    RCTPromiseResolveBlock _resolve;//定义了一个全局的Block}- (instancetype)init {    if (self = [super init]) {        self->_resolve = nil;//初始化置空        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURL:) name:kOpenURLNotification object:nil];    }    return self;}- (void)dealloc {    [[NSNotificationCenter defaultCenter] removeObserver:self];}- (void)handleOpenURL:(NSNotification *)notification {    NSString *urlString = notification.userInfo[@"url"];    NSURL *url = [NSURL URLWithString:urlString];    if ([url.host isEqualToString:@"safepay"]) {        [AlipaySDK.defaultService processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {         //由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑            if (self->_resolve) {                self->_resolve(resultDic);//接受并返回回调信息                self->_resolve = nil;            }            NSLog(@"processOrderWithPaymentResult = %@", resultDic);        }];        [AlipaySDK.defaultService processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {            NSLog(@"processAuth_V2Result = %@", resultDic);        }];    }}- (dispatch_queue_t)methodQueue{    return dispatch_get_main_queue();}RCT_EXPORT_MODULE()RCT_EXPORT_METHOD(authWithInfo:(NSString *)infoStr resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {    [AlipaySDK.defaultService auth_V2WithInfo:infoStr fromScheme:self.appScheme callback:^(NSDictionary *resultDic) {        resolve(resultDic);    }];}RCT_EXPORT_METHOD(pay:(NSString *)orderInfo resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {        self->_resolve = resolve;//跳到支付宝时候  赋值    [AlipaySDK.defaultService payOrder:orderInfo fromScheme:self.appScheme callback:^(NSDictionary *resultDic) {         self->_resolve = nil;//回调置空         resolve(resultDic);    }];}RCT_EXPORT_METHOD(payInterceptorWithUrl:(NSString *)urlStr                  resolver:(RCTPromiseResolveBlock)resolve                  rejecter:(RCTPromiseRejectBlock)reject) {    [AlipaySDK.defaultService payInterceptorWithUrl:urlStr fromScheme:self.appScheme callback:^(NSDictionary *resultDic) {        resolve(resultDic);    }];}RCT_EXPORT_METHOD(getVersion:(RCTPromiseResolveBlock)resolve) {    resolve(AlipaySDK.defaultService.currentVersion);}- (NSString *)appScheme {    NSArray *urlTypes = NSBundle.mainBundle.infoDictionary[@"CFBundleURLTypes"];    for (NSDictionary *urlType in urlTypes) {        NSString *urlName = urlType[@"CFBundleURLName"];        if ([urlName hasPrefix:@"alipay"]) {            NSArray *schemes = urlType[@"CFBundleURLSchemes"];            return schemes.firstObject;        }    }    return nil;}@end

注意:

  1. URL_Schemes 的设置
  2. 注意 appdelegate.m中的
- (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];}
原创粉丝点击