业务描述
项目中需要实现一个领红包的业务。具体流程就是,网页端发起授权,客户端完成授权后将授权码给网页,网页端进行领红包业务处理,领取成功后再通知客户端进行业务逻辑跳转。
使用的相互通信的桥梁
- WebViewJavascriptBridge
代码实现
导入头文件
- #import “WebViewJavascriptBridge.h”
- #import <AlipaySDK/AlipaySDK.h>
- #import “APAuthV2Info.h”
- #import “RSADataSigner.h”
备注:文件就不上传了,支付宝demo都有
声明一个属性@property WebViewJavascriptBridge* bridge;
继续实现
‘’’javascript
(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//这里的if可以忽略,因为是自己的业务逻辑需要if ([self.type isEqualToString:@”weburl”]) {
//从这里看起 if (_bridge) { return; } //bridge使用方法 [WebViewJavascriptBridge enableLogging]; _bridge = [WebViewJavascriptBridge bridgeForWebView:_web]; [_bridge setWebViewDelegate:self]; [self loadExamplePage:_web]; //支付宝uid 先注册一个网页端需要调用的方法 [_bridge registerHandler:@"getPayeeUserIdByIos" handler:^(id data, WVJBResponseCallback responseCallback) { dispatch_async(dispatch_get_main_queue(), ^{ [self doAlipayAuth:responseCallback]; }); }]; //领取红包成功后返回AR,网页端领取成功后调用客户端的方法 [_bridge registerHandler:@"getBackAr" handler:^(id data, WVJBResponseCallback responseCallback) { dispatch_async(dispatch_get_main_queue(), ^{ [self back]; }); }];
}
}
‘’’
支付宝登录授权部分,支付宝demo的例子
‘’’javascript
(void)doAlipayAuth:(WVJBResponseCallback )callback
{
//重要说明
//这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
//真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
//防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
/============================================================================/
/=======================需要填写商户app申请的===================================/
/============================================================================/
NSString *pid = @””;
NSString *appID = @””;// 如下私钥,rsa2PrivateKey 或者 rsaPrivateKey 只需要填入一个
// 如果商户两个都设置了,优先使用 rsa2PrivateKey
// rsa2PrivateKey 可以保证商户交易在更加安全的环境下进行,建议使用 rsa2PrivateKey
// 获取 rsa2PrivateKey,建议使用支付宝提供的公私钥生成工具生成,
// 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1NSString *privateKey = @”你的私钥”;
NSString rsaPrivateKey = privateKey;
/============================================================================/
/============================================================================/
/============================================================================*///pid和appID获取失败,提示
if ([pid length] == 0 ||[appID length] == 0 || ([rsa2PrivateKey length] == 0 && [rsaPrivateKey length] == 0))
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"缺少pid或者appID或者私钥。" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alert show]; return;
}
//生成 auth info 对象
APAuthV2Info *authInfo = [APAuthV2Info new];
authInfo.pid = pid;
authInfo.appID = appID;//auth type
NSString *authType = [[NSUserDefaults standardUserDefaults] objectForKey:@”authType”];
if (authType) {authInfo.authType = authType;
}
//应用注册scheme,在AlixPayDemo-Info.plist定义URL types
NSString *appScheme = @”alipaysend”;// 将授权信息拼接成字符串
NSString *authInfoStr = [authInfo description];
NSLog(@”authInfoStr = %@”,authInfoStr);// 获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
NSString signedString = nil;
RSADataSigner signer = [[RSADataSigner alloc] initWithPrivateKey:((rsa2PrivateKey.length > 1)?rsa2PrivateKey:rsaPrivateKey)];
if ((rsa2PrivateKey.length > 1)) {signedString = [signer signString:authInfoStr withRSA2:YES];
} else {
signedString = [signer signString:authInfoStr withRSA2:NO];
}
// 将签名成功字符串格式化为订单字符串,请严格按照该格式
if (signedString.length > 0) {authInfoStr = [NSString stringWithFormat:@"%@&sign=%@&sign_type=%@", authInfoStr, signedString, ((rsa2PrivateKey.length > 1)?@"RSA2":@"RSA")]; [[AlipaySDK defaultService] auth_V2WithInfo:authInfoStr fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); // 解析 auth code NSString *result = resultDic[@"result"]; NSString *authCode = nil; if (result.length>0) { NSArray *resultArr = [result componentsSeparatedByString:@"&"];
NSString *uid = resultArr[4];
//这里调用网页端的方法并传值
callback([uid componentsSeparatedByString:@"="][1]);
for (NSString *subResult in resultArr) {
if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
break;
}
}
}
NSLog(@"授权结果 authCode = %@", authCode?:@"");
}];
}
}
‘’’