支付

微信支付集成

前段时间,公司突然要在App中集成支付功能。毫无意外的选择了支付宝微信

  • 支付宝,这里就不多说了。按照官方的SDK文档,一步一步,很清晰,还有Demo演示。
  • 微信,集成就比较麻烦了。没有系统的文档,没有官方的Demo,说明也是这里一句,那里一句,坑得要死。这里就记录一下微信支付的集成流程,以及当中遇到的问题。

PS:这里只介绍如何在App端完成整个支付流程,实际支付时,签名啥的应该是放在服务器的。


前置条件准备: 申请开发者账号->注册应用->申请开通支付功能(300/年)

官方的流程还是可以看看的

支付时序图

  1. SDK导入应用(这一步应该不需要多说)。
  2. 预支付,微信与支付宝不一样的地方,它先得向微信服务器进行一个预支付操作,获取预支付idprepay_id。而这个预支付id则是用来进行实际支付时的一个必填参数。
    // 微信的预支付接口地址
    NSString *urlString = @"https://api.mch.weixin.qq.com/pay/unifiedorder";
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"appid"] = @"应用id";
    params[@"mch_id"] = @"商户id";
    params[@"trade_type"] = @"APP";
    params[@"body"] = [NSString stringWithFormat:@"支付测试"];
    params[@"out_trade_no"] = number;
    params[@"total_fee"] = @((int)(price.doubleValue * 100)).description;
    params[@"notify_url"] = @"http://api.cloud.com";
    params[@"nonce_str"] = @"5K8264ILTKCH16CQ2502SI8ZNMTM67VS";
    params[@"attach"] = @"杭州分店";
    params[@"spbill_create_ip"] = @"192.168.1.1";
    params[@"device_info"] = @"WEB";
    params[@"sign"] = [self sign];

    [self.manager POST:urlString parameters:[WXPayHelper toXML:params] progress:nil success:^(NSURLSessionDataTask *_Nonnull task, NSData *data) {
        NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
        parser.delegate = self;
        BOOL success = [parser parse];
        NSLog(@"解析:%d", success);
    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
        NSLog(@"%@", error);
        self.req = nil;
        PayResp *resp = [PayResp new];
        resp.errCode = (int)error.code;
        resp.errStr = error.localizedDescription;
    }];
预支付返回内容
<xml>
      <return_code><![CDATA[SUCCESS]]></return_code>
      <return_msg><![CDATA[OK]]></return_msg>
      <appid><![CDATA[返回的appid]]></appid>
      <mch_id><![CDATA[商户id]]></mch_id>
      <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
      <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
      <result_code><![CDATA[SUCCESS]]></result_code>
      <prepay_id> <![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
      <trade_type><![CDATA[APP]]></trade_type>
</xml> 
注意,你在调试的时候,可能会发现此事返回的sign签名与请求时传上去的不一样,没关系,可能时他那边后台做过处理。此时你只需要解析prepay_id字段就好了。
  1. 支付,利用第二步获取到的预支付id,发起支付请求。
PayReq *request = [[PayReq alloc] init];
request.partnerId = @"商户id";
request.prepayId= @"上一步返回的预支付id";
request.package = @"Sign=WXPay";
request.nonceStr= @"随机字符串";
request.timeStamp = @"时间戳";
request.sign= [self sign]; // 签名
[WXApi sendReq:request];

不得不吐槽的是微信的支付回调居然是delegate,而没有用上现在主流的block

-(void)onResp:(BaseResp*)resp
{
      if ([respisKindOfClass:[PayRespclass]])
          {
        PayResp*response=(PayResp*)resp;
        switch(response.errCode){
                   caseWXSuccess:
                        //服务器端查询支付通知或查询API返回的结果再提示成功
                        NSlog(@"支付成功");
                        break;
                        default:
                        NSlog(@"支付失败,retcode=%d",resp.errCode);
                        break;
                  }
          }
}

基本上这到这一步就没啥问题了。

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

推荐阅读更多精彩内容

  • iOS支付 iOS支付分为两类,第三方支付和应用内支付(内购)。 第三方支付包括:支付宝支付、微信支付、银联支付、...
    请输入账号名阅读 6,345评论 3 22
  • 自己总结的微信支付宝支付流程和注意点: 准备工作: 需要公司的营业执照,税务信息,等老板的身份证信息等,我记得,用...
    Www刘阅读 18,602评论 2 50
  • 引言 秋高气爽,天气转凉,正是学习工作做的好时候。(~ ̄▽ ̄)~~(~ ̄▽ ̄)~ 我是个phper最近在写微信支付...
    恩就是这个名阅读 8,081评论 2 15
  • 2015/6/25,从南京一路到福州,第一次坐飞机,注定是满是好奇,从上飞机到坐下,各种注意事项都是铭记于心,我希...
    暮光雨泽阅读 320评论 0 1
  • 曾经沧海难为水,除却巫山不是云。取次花丛懒回顾,半缘修道半缘君。——元稹《离思五首·其四》 看到这首诗,觉得它表达...
    无语呤咽阅读 3,094评论 10 10