iOS开发微信支付的介绍与实现

1、前期准备

    1. 微信开放平台注册账号

      iOS开发微信支付的介绍与实现
    • 需要登录邮箱验证

      iOS开发微信支付的介绍与实现
    • 填写您的商户信息

      iOS开发微信支付的介绍与实现
    1. 进入管理中心 --- 移动应用 --- 创建移动应用 --- 根据页面完善应用资料
    1. 审核过后,通过应用详情页面,查看应用详情,查看AppID和AppSecret相关信息
    1. 创建这些是没有支付能力的,需要额外申请,还是根据提示一步步填写,填写完之后会发一封邮件到您的预留的邮箱,然后到商户平台点击打开链接填写资料,最主要的是验证下开户收款账号,会收到一波几分钱的巨额财产,那么这个时候如果你填写的是你的开户账号,直接跑路吧,这些钱够你在深圳买房了。。。。。。如果你是个好人,那么找你们财务验证下是否有收到,就代表通过了,愉快的代码时间来了.

2、实现过程

  • 步骤1:
    • 用户在商户APP中选择商品,提交订单,选择微信支付。
  • 步骤2:
    • 商户后台收到用户支付单,调用微信支付统一下单接口
  • 步骤3:
    • 统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
  • 步骤4:
  • 步骤5:
  • 步骤6:

3、代码部分

  • 代码地址
  • 3.1 工程配置

    • SDK接入

      iOS开发微信支付的介绍与实现
    • 依赖库导入

      iOS开发微信支付的介绍与实现
    • 配置下Scheme(这填写的是从微信申请回来的ID)

      iOS开发微信支付的介绍与实现
  • 3.2 代码实现

    • ①向微信注册你的AppID

      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      
      	[self addAppKeyWindow];
      // 注册APP,这里的字符串就是Wechat URL Scheme里面对应的ID 也是申请回来的ID,必须一致
      [WXApi registerApp:@"wxb4ba3c02aa476ea1" enableMTA:NO]; return YES;
      }
    • ②请求服务器的参数,拉起微信支付App

      - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
      [super touchesBegan:touches withEvent:event]; // 调起微信支付
      PayReq *req = [[PayReq alloc] init]; req.partnerId = @"1900006771";
      req.prepayId = @"wx14215832306243f22c2cb64d1193213932";
      req.nonceStr = @"25e0c43f7a5a8f743bdb818a72799396";
      req.timeStamp = 1579010312;
      req.package = @"Sign=WXPay";
      req.sign = @"2C1EEC439D493D7936F292AFDFFA244D";
      [WXApi sendReq:req];
      }
      • 这里请求的方法和步骤就不写了,无非就是post信息给服务器,咱们看看需要的数据格式(假数据)
      • 以下数据是你自己商户后台请求处理返回的结果
      {
      "appid" : "wxb4b",微信开放平台审核通过的AppID
      "noncestr" : "171127dd056d05e423c8b9e",随机字符串
      "package" : "Sign=WXPay", 固定值
      "partnerid" : "130", 微信支付分配的商户ID
      "prepayid" : "wx201609291601", 预支付交易会话ID
      "sign" : "684371081C049B6017641", 签名,除了sign,剩下6个组合的再次签名字符串
      "timestamp" : 147513 当前时间
      }
    • ③处理回调信息

      - (BOOL)application:(UIApplication *)application
      openURL:(nonnull NSURL *)url
      options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
      return [WXApi handleOpenURL:url delegate:[CHWXApiManager sharedManager]];
      }
      • 这里的处理是根据微信官网提供的方法,代理到专门处理的单利当中去统一处理WXApiManager
      • 注意:这里的支付结果是支付完成时回调过来的,这是不准确的,是否支付成功要根据自己后台返回的结果。
      #import "CHWXApiManager.h"
      
      @implementation CHWXApiManager
      
      + (instancetype)sharedManager {
      static dispatch_once_t onceToken;
      static CHWXApiManager *instance;
      dispatch_once(&onceToken, ^{
      instance = [[CHWXApiManager alloc] init];
      });
      return instance;
      } #pragma mark - WXApiDelegate
      /*! @brief 发送一个sendReq后,收到微信的回应
      *
      * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
      * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
      * @param resp 具体的回应内容,是自动释放的
      */
      - (void)onResp:(BaseResp *)resp {
      if([resp isKindOfClass:[PayResp class]]) {
      // 支付返回结果,实际支付结果需要去微信服务器端查询
      NSString *strMsg, *strTitle = [NSString stringWithFormat:@"支付结果"]; switch (resp.errCode) {
      case WXSuccess:
      strMsg = @"支付结果:成功!";
      NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
      break; default:
      strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
      NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
      break;
      }
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle
      message:strMsg
      delegate:self
      cancelButtonTitle:@"OK"
      otherButtonTitles:nil, nil];
      [alert show];
      }
      else {
      }
      } /*! @brief 收到一个来自微信的请求,第三方应用程序处理完后调用sendResp向微信发送结果
      *
      * 收到一个来自微信的请求,异步处理完成后必须调用sendResp发送处理结果给微信。
      * 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。
      * @param req 具体请求内容,是自动释放的
      */
      - (void)onReq:(BaseReq *)req { } @end

4、需要注意的问题

  • ①App Scheme一定要配置正确
  • ②千万不能用生成预订单返回的Sign,要重新生成(和后台沟通)
  • ③要考虑拉起App支付的时候自己程序被退出或者自杀了
  • ④一定不能用异步返回给App的参数进行判断成功与否,需要和后台进行二次确认,异步返回给后台的数据才是最终的

5、常见问题及解决办法

上一篇:JMeter使用jar进行压力测试


下一篇:ADO.NET工具类(一)