微信支付

官方建议使用服务器签名来接入微信支付,从安全上考虑,客户端不应该知道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:商户后台接收支付通知。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言:本篇文章目的在于梳理知识,巩固思想,学习总结。有什么好的建议,都可以留言。互相促进!总观,微信支付,也没心思...
    麦穗0615阅读 10,087评论 8 70
  • 自己总结的微信支付宝支付流程和注意点: 准备工作: 需要公司的营业执照,税务信息,等老板的身份证信息等,我记得,用...
    Www刘阅读 18,581评论 2 50
  • 目前项目里有微信支付的需求,调研过一段时间后,发现其实并没有想象中的那么困难。如果你只是想实现该功能,一个方法足以...
    劉光軍_MVP阅读 1,465评论 0 7
  • 实现支付宝支付的准备工作: 1.向支付宝签约,成为支付宝的商户 签约完成后,支付宝会提供一些必要的数据给我们 商户...
    Anson杨春安阅读 8,257评论 0 6
  • <一>、添加微信sdk 把微信sdk下载下来,然后会报错,这时需要去Target中的Link Binary Wit...
    请叫我平爷阅读 1,941评论 0 7