iOS开发--微信支付接入

作者: 爱吃鱼的小灰 | 来源:发表于2017-03-14 09:53 被阅读1021次

    首先你需要申请微信支付,申请相关支付参考:
    申请资料填写界面预览

    申请到微信支付相关以后,下面这些东西对我们很重要。
    前提条件:

    //APPID 一般以wx开头
    static NSString *const JHAppID = @"APPID";
    //appsecret
    static NSString *const JHAppSecret = @"appsecret";
    //商户号,填写商户对应参数
    static NSString *const JHMchID = @"商户号";
    //商户API密钥,填写相应参数
    static NSString *const JHPartnerID = @"商户API密钥";
    // 预支付请求路径固定可以不改变
    static NSString *const JHPrePayURL = @"https://api.mch.weixin.qq.com/pay/unifiedorder";
    // // 支付回调页面(异步)   (https://api.mch.weixin.qq.com/pay/unifiedorder)(异步处理支付调用返回数据)
    static NSString *const JHPayNotifyURL = @"支付回调页面";
    

    注意:

    微信支付的单位为分,整数类型才可以(int)
    • 流程简述
      支付要保证安全性,就要使用加密。微信当然也是这样,微信为了防止中间有人加入窃取信息或者改变价格。有自己的加密方式——生成预支付Id,我们通过封装数据形成XML格式(中间加密)以字符串类型传给微信,获取预支付Id。紧接着,获取以后通过预支付等信息再次加密。APP将参数传给微信,付款成功!回调信息说明支付情况。(关于加密具体怎么实现我会在下面详细说明)。

    • 接入步骤以及代码

    1、在做微信支付以前导入:

    libc++.tbd
    libsqlite3.0.tbd
    libz.tbd
    SystemConfiguration.framework
    CoreTelephony.framework
    Security.framework
    

    2、在AppDelegate 的导入头文件 #import "WXApi.h" 挂上代理 WXApiDelegate

     - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    //这里是你自己写的一些其他代码 实例化window 设置根视图云云
      [WXApi registerApp:@"APPID" withDescription:@"应用描述"];
    
      } 
     //支付回调
      - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
       return  [WXApi handleOpenURL:url delegate:self];
       }
      - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
       return [WXApi handleOpenURL:url delegate:self];
       }
       #pragma mark 微信回调的代理方法
       - (void)onResp:(BaseResp *)resp {
       if ([resp isKindOfClass:[PayResp class]]) {
       PayResp *response = (PayResp *)resp;
       switch (response.errCode) {
       case WXSuccess:
       NSLog(@"suceess");
       break;
       default:
       NSLog(@"failed");
       break;
       }
       }
       }
    
    如果集成里支付宝以及微信支付等 ,走的回调方法是相同的 ,我们是通过 回调中字符串sourceApplication 进行判断的 例如支付宝支付 为com.alipay.iphoneclient 微信支付为 com.tencent.xin

    3、在targets的info中添加 urltypes添加一个在 identifier自己起一个名称(最好软件英文名字) 在 URL schemes 中写下APPID

    1.png

    4、触发支付
    触发支付,就要对自己的订单号价格等进行加密 在这里就可以分成两种加密 ,一种是在APP端进行加密,第二种是在服务端进行加密。一般使用的在服务端加密比较安全。一个个进行说明。

    • 服务端进行加密
      服务端加密我们不需要知道具体加密怎么进行的。我们只是需要将所需参数传过去 我是用的AFN
     //初始化一个请求管理器
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    //接口地址
    NSString *urlString = [NSString stringWithFormat:@"%@%@",@"地址头",@"其他"];
    //参数字典
    NSDictionary *parameters =@{@"fcode": @"账号",
                                @"password": @"密码",@"out_trade_no":@"订单号",@"total_fee":@"金额(分为单位)",@"attach":@"商品详情"};
    //post请求
    [manager POST:urlString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        //返回状态值1表示成功 0表示失败
        NSString *state=responseObject[@"state"];
       //预支付ID
        NSString *prepayid=responseObject[@"prepayid"];
       //返回文字信息成功或者失败
        NSString *message=responseObject[@"message"];
       //请求数据成功
            if ([state intValue]==1) {
       //支付信息
                PayReq* req             = [[PayReq alloc] init];
       //APPID
                req.openID              = [responseObject objectForKey:@"appid"];
       //商户号
                req.partnerId           = [responseObject objectForKey:@"partnerid"];
       //预支付ID
                req.prepayId            = [responseObject objectForKey:@"prepayid"];
       //时间戳
                req.nonceStr            = [responseObject objectForKey:@"noncestr"];
       //支付类型(为固定字符串:Sign=WXPay)
                req.timeStamp           = [[responseObject objectForKey:@"timestamp"] intValue];
       //加密串
                req.package             = [responseObject objectForKey:@"package"];
       //预支付ID
                req.sign                = [responseObject objectForKey:@"sign"];
    
                // 发起微信支付
                [WXApi sendReq:req];;
    
            }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    }];
    

    后台没有加密错误,那么会跳转到微信上进行支付。

    • 微信支付成功以后 要通知服务端以及APP端 服务器是通过回调地址进行操作,而对于App端通过Appdelegate中回调函数调用微信代理。
     - (BOOL)application:(UIApplication *)application    handleOpenURL:(NSURL *)url {
       return  [WXApi handleOpenURL:url delegate:self];
      }
      - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
       return [WXApi handleOpenURL:url delegate:self];
       }
       #pragma mark 微信回调的代理方法
     - (void)onResp:(BaseResp *)resp {
    if ([resp isKindOfClass:[PayResp class]]) {
        PayResp *response = (PayResp *)resp;
        NSString *message;
        switch (response.errCode) {
          case WXSuccess:
            {  message=@"支付成功";
                [[NSNotificationCenter defaultCenter] postNotificationName:APP_PAY_SUCCESS object:nil];
            }
                break;
            case WXErrCodeCommon:
             //普通错误类型
                message=@"支付错误";
                break;
            case WXErrCodeUserCancel:
               //用户点击取消并且返回
               message=@"您取消了交易";
                break;
            case WXErrCodeSentFail:
                //发送失败
               message=@"信息发送失败";
                break;
            case WXErrCodeAuthDeny:
               //授权失败
                message=@"授权失败";
                break;
            case WXErrCodeUnsupport:
              //微信不不支持
               message=@"您的微信版本过低";
                break;
            default:
                NSLog(@"failed");
                break;
        }
      }
    }
    

    支付成功以后通过通知告知用户支付情况.

    • 支付界面接收成功通知告知用户(我这里是跳转到新的界面)
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appPaySuccess) name:APP_PAY_SUCCESS object:nil];
    
    • 通知方法
    -(void)appPaySuccess{
    ZQPaySuccessVC *paySuccessVC=[[ZQPaySuccessVC alloc]init];
    [self.navigationController pushViewController:paySuccessVC animated:YES];
    }
    
    • 移除通知(不移除会崩溃呦)
    -(void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:APP_PAY_SUCCESS object:nil];
    }
    

    相关文章

      网友评论

      • 温水煮青蛙a:我有个问题
        支付完成后
        1点左上角的返回自己的app 不走微信的回调方法
        2按home键 返回自己的app 不走微信的回调方法
        这种情况 怎么解决呢
      • 30563c215a38:[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appPaySuccess) name:APP_PAY_SUCCESS object:nil]; 支付界面接收成功跳转 这个通知要写在点击支付的界面里 还是应该写在APPDelegate里面啊
        爱吃鱼的小灰:@菲我莫属_c5b2 这个是通知的名字啊在注册通知是命名的
        30563c215a38:@爱吃鱼的小灰 你的APP_KEY_SUCCESS是哪里创建的, 加个QQ呗.317505283
        爱吃鱼的小灰:@菲我莫属_c5b2 支付界面
      • 30563c215a38:你的步骤2[WXApi registerApp:@"APPID" withDescription:@"应用描述"]; 已经没有了这个方法啊 .
        30563c215a38:@爱吃鱼的小灰 新文档没找到,能加个QQ 请教下问题吗.最近在弄微信支付
        爱吃鱼的小灰:@菲我莫属_c5b2 哦这个是我很早的笔记了,我去看下最新的文档再修改下吧!谢谢提醒

      本文标题:iOS开发--微信支付接入

      本文链接:https://www.haomeiwen.com/subject/cfebgttx.html