1、微信支付



1.0、前提

微信开发者平台注册App这样的事,一般是经理给你做好的,这个可以忽略;如果需要做的话,可以参考别人的这篇文章。微信支付没有想象的那么困难,下面我会写两种:一种在客户端(App)完成,一种在后台完成。



1.1、开发前你需要看看微信开发的文档微信的App开发步骤

微信的支付交互图:

微信的支付交互图

iOS 微信和支付宝的最新整理(客户端和后台两种demo,源代码可供下载) - 敏捷大拇指 - 微信的支付交互图

微信的支付交互图



1.2、理清楚支付的流程

下面的过程虽然复杂,但是支付时很简单,稍后会采用客户端和后台的两种方式去讲解,也会有demo展示:

1.用户使用APP客户端,选择商品下单。

2.商户客户端(就是你做的APP)将用户的商品数据传给商户服务器,请求生成支付订单。

3.商户后台调用统一下单API向微信的服务器发送请求,微信服务器生成预付单,并生成一个prepay_id返回给商户后台。

4.商户后台将这个prepay_id返回给商户客户端。

5.用户点击确认支付,这时候商户客户端调用SDK打开微信客户端,进行微信支付。

6.微信客户端向微信服务器发起支付请求并返回支付结果(他们之间交互用的就是prepay_id这个参数,微信的服务器要验证微信客户端传过去的参数是否跟第三步中生成的那个id一致)。

7.用户输入支付密码后,微信客户端提交支付授权,跟微信服务器交互,完成支付

8.微信服务器给微信客户端发送支付结果提示,并异步给商户服务器发送支付结果通知。

9.商户客户端通过支付结果回调接口查询支付结果,并向后台检查支付结 果是否正确,后台返回支付结果。

10.商户客户端显示支付结果,完成订单,发货。



1.3、客户端需要做的是调用支付,显示支付结果

客户端需要做的是调用支付,显示支付结果

iOS 微信和支付宝的最新整理(客户端和后台两种demo,源代码可供下载) - 敏捷大拇指 - 客户端需要做的是调用支付,显示支付结果

客户端需要做的是调用支付,显示支付结果



1.4、下面开始讲解集成微信支付


1.4.1、先对微信SDK的下载拖进工程

微信SDK的下载

iOS 微信和支付宝的最新整理(客户端和后台两种demo,源代码可供下载) - 敏捷大拇指 - 微信SDK的下载

微信SDK的下载


1.4.2、导入微信支付SDK库

在Target —> BuildPhases —> Link Binary With Libraries— 点击+号 -> 搜索你需要的系统库。

  • SystemConfiguration.framework
  • libz.tbd
  • libsqlite3.0.tbd
  • CoreTelephony.framework
  • QuartzCore.framework


导入微信支付SDK库

iOS 微信和支付宝的最新整理(客户端和后台两种demo,源代码可供下载) - 敏捷大拇指 - 导入微信支付SDK库

导入微信支付SDK库


1.4.3、导入WechatTool

导入WechatTool

iOS 微信和支付宝的最新整理(客户端和后台两种demo,源代码可供下载) - 敏捷大拇指 - 导入WechatTool

导入WechatTool


1.4.4、设置URL Scheme

设置URL Scheme

iOS 微信和支付宝的最新整理(客户端和后台两种demo,源代码可供下载) - 敏捷大拇指 - 设置URL Scheme

设置URL Scheme


1.4.5、在Appdelegate中注册APPID

[Objective-C] 纯文本查看 复制代码
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [WXApi registerApp:MXWechatAPPID];

    return YES;
 }

// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
      if ([url.host isEqualToString:@"safepay"]) {

          NSLog(@"这里做支付宝的操作");

      }else{

        return  [WXApi handleOpenURL:url delegate:[JKApiManager sharedManager]];

      }
    return YES;
}

#pragma mark - 微信支付回调
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return [WXApi handleOpenURL:url delegate:[JKApiManager sharedManager]];
}



1.4.6、在使用的地方调用(你需要把一些参数传进去6个)

  • 调用微信支付前,需要下单、签名等操作,以便获取微信支付所必要的参数。为了提高安全性,下单、签名操作一般是在后台完成,在前台做的话被捕获改信息就不开心了。。。。。
  • JKWechatPayHandler类里面需要的参数包括:appid、partid(商户号)、prepayid(预支付订单ID)、noncestr(参与签名的随机字符串)、timestamp(参与签名的时间戳)、sign(签名字符串)这六个。


[Objective-C] 纯文本查看 复制代码
//发起微信支付

[JKWechatPayHandler jumpToWxPay];



1.4.7、下面开始讲解后台来做操作给我们生成上面的六个参数以及新的调用

1.4.7.1、遵守协议WXApiDelegate

1.4.7.2、在AppDelegate里面调用

[Objective-C] 纯文本查看 复制代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [WXApi registerApp:MXWechatAPPID];

    return YES;
}

// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
     if ([url.host isEqualToString:@"safepay"]) {

           NSLog(@"这里做支付宝的操作");

 }else{

   /*
    *  后台生成六个参数调用时
    */
    // return  [WXApi handleOpenURL:url delegate:self];
   /*
    *  app自己生成六个参数调用时
    */
   return  [WXApi handleOpenURL:url delegate:self];

    }
   return YES;
 }

#pragma mark - 微信支付回调

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
   /*
    *  后台生成六个参数调用时
    */
    // return  [WXApi handleOpenURL:url delegate:self];
    /*
     *  app自己生成六个参数调用时
     */
    return  [WXApi handleOpenURL:url delegate: self];
  }
 //微信SDK自带的方法,处理从微信客户端完成操作后返回程序之后的回调方法,显示支付结果的
 -(void) onResp:(BaseResp*)resp
 {
     //启动微信支付的response
     NSString *payResoult = [NSString stringWithFormat:@"errcode:%d", resp.errCode];

     if([resp isKindOfClass:[PayResp class]]){
     //支付返回结果,实际支付结果需要去微信服务器端查询
      switch (resp.errCode) {
          case 0:
             payResoult = @"JK支付结果:成功!";
             NSLog(@"%@",payResoult);
          break;
          case -1:
             payResoult = @"JK支付结果:失败!";
             NSLog(@"%@",payResoult);
          break;
          case -2:
            payResoult = @"JK用户已经退出支付!";
            NSLog(@"%@",payResoult);
         break;
        default:
           payResoult = [NSString stringWithFormat:@"JK支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
           NSLog(@"%@",payResoult);
         break;
       }
    }
}


1.4.7.3、在使用时调用

[Objective-C] 纯文本查看 复制代码
/*
 *  自己写的支付
 */
 - (void)WXPay{

/*在这里把价格和商品的信息发送给服务器,服务器会生成上面的6个参数(我们后台生成的是一个字典,里面是6个键值,对应的是6个参数值)在此调用下面的方法传到下面去*/

 }

 -(void)payDictionary:(NSDictionary *)dict{

   //需要创建这个支付对象
      PayReq *req   = [[PayReq alloc] init];
   //由用户微信号和AppID组成的唯一标识,用于校验微信用户
      req.openID = [NSString stringWithFormat:@"%@",dict[@"appid"]];

   // 商家id,在注册的时候给的
      req.partnerId = [NSString stringWithFormat:@"%@",dict[@"partnerid"]];

   // 预支付订单这个是后台跟微信服务器交互后,微信服务器传给你们服务器的,你们服务器再传给你
      req.prepayId  = [NSString stringWithFormat:@"%@",dict[@"prepayid"]];

   // 根据财付通文档填写的数据和签名
   //这个比较特殊,是固定的,只能是即req.package = Sign=WXPay
      req.package = @"Sign=WXPay";

   // 随机编码,为了防止重复的,在后台生成
      req.nonceStr  = [NSString stringWithFormat:@"%@",dict[@"noncestr"]];

   // 这个是时间戳,也是在后台生成的,为了验证支付的
       NSString * stamp = [NSString stringWithFormat:@"%@",dict[@"timestamp"]];
       req.timeStamp = stamp.intValue;

   // 这个签名也是后台做的
      req.sign = [NSString stringWithFormat:@"%@",dict[@"sign"]];

   //发送请求到微信,等待微信返回onResp
   [WXApi sendReq:req];

  }


1.4.7.4、支付成功与否在AppDelegate里面会有微信的回调可以看出支付成功还是失败

1.4.7.5、下面奉上两个demo,里面有运行调试的说明,在图片里面有说明。

微信的两种支付方式demo

iOS 微信和支付宝的最新整理(客户端和后台两种demo,源代码可供下载)微信支付的两种.zip (13.5 MB, 下载次数: 0, 售价: 142 金钱)