网页与iOS的交互领红包案列

业务描述

项目中需要实现一个领红包的业务。具体流程就是,网页端发起授权,客户端完成授权后将授权码给网页,网页端进行领红包业务处理,领取成功后再通知客户端进行业务逻辑跳转。

使用的相互通信的桥梁

  • 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=1

    NSString *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?:@"");
                                       }];
}

}

‘’’

end