微信支付

作者: wpf_register | 来源:发表于2016-08-05 22:32 被阅读74次

官方建议使用服务器签名来接入微信支付,从安全上考虑,客户端不应该知道RAS密钥,也不需要每个客户端都写一遍签名的算法。

前言

申请开通微信支付功能,需要认证开发者资质300/次,微信发邮件给API参数表。后面的代码当中的APPID 为测试代码的APPID.


参数

支付流程

  1. 导入支付SDK,注册微信支付
  • Info.plist中增加如下代码
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
  • 导入第三方框架和链接库
 Security.framework
CoreTelephony.framework
SystemConfiguration.framework
libc++.tbd
lib.tbd
libsqlite3.tbd
libWeChatSDK.a
  • APPID设置为URL Schemes


    URL Schemes
  • 在AppDelegate中注册
  //注册微信
    -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
         //向微信注册wxd930ea5d5a258f4f
         [WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"demo 2.0"];
         return YES;
}
//设置代理
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
        return  [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
        return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
  1. 发起支付
-(IBAction)weixinPayAction:(UIButton *)sender {
    //先判断是否安装微信或是否支持微信支付
    if (![WXApi isWXAppInstalled])
        return ;
   if (![WXApi isWXAppSupportApi])
        return ;
   //向后台请求数据
    [self PayAction];  
}
-(NSString*)PayAction{
    NSString *urlString   = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
    //解析服务端返回json数据
    NSError *error;
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    if ( response != nil) {
        NSMutableDictionary *dict = NULL;
        dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
        if(dict != nil){            
            NSMutableString *retcode = [dict objectForKey:@"retcode"];
            if (retcode.intValue == 0){            
                //调起微信支付
              PayReq* req   = [[PayReq alloc] init];   
              //微信号和AppID组成的唯一标识,发送请求时第三方程序必须填写,
              //用于校验微信用户是否换号登录 
              req.openID    = [dict objectForKey:@"openID"];  //商户 
              req.partnerId = [dict objectForKey:@"partnerid"];  //商户号ID
              req.prepayId  = [dict objectForKey:@"prepayid"];//预支付交易ID
              req.nonceStr  = [dict objectForKey:@"noncestr"]; //随机字符串
              req.timeStamp = [dict objectForKey:@"timestamp"].intValue;//时间戳
              req.sign      = [dict objectForKey:@"sign"]; //签名
              req.package   = [dict objectForKey:@"package"];//扩展字段,固定值@“Sign=WXPay”
              [WXApi sendReq:req];

                return @"一切OK";
            }else{
                return [dict objectForKey:@"retmsg"];
            }
        }else{
            return @"服务器返回错误,未获取到json对象";
        }
    }else{
        return @"服务器返回错误";
    }
}
  1. 处理微信支付返回信息
- (void)onResp:(BaseResp *)resp {
   if([resp isKindOfClass:[PayResp class]]){
        //支付返回结果,实际支付结果需要去微信服务器端查询
        switch (resp.errCode) {
            case WXSuccess:
                NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
                break;
            default:                
                NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
                break;
        }
  }
}

微信文档
参考文档0
参考文档1

商户系统和微信支付系统主要交互说明:

步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。

步骤2:商户后台收到用户支付单,调用微信支付****统一下单接口****。

步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay

步骤4:商户APP调起微信支付

步骤5:商户后台接收支付通知。

相关文章

网友评论

    本文标题:微信支付

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