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
注意:
- URL_Schemes 的设置
- 注意 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];
}