iOS开发--微信支付接入

首先你需要申请微信支付,申请相关支付参考:
申请资料填写界面预览

申请到微信支付相关以后,下面这些东西对我们很重要。
前提条件:

//APPID 一般以wx开头
static NSString *const JHAppID = @"APPID";
//appsecret
static NSString *const JHAppSecret = @"appsecret";
//商户号,填写商户对应参数
static NSString *const JHMchID = @"商户号";
//商户API密钥,填写相应参数
static NSString *const JHPartnerID = @"商户API密钥";
// 预支付请求路径固定可以不改变
static NSString *const JHPrePayURL = @"https://api.mch.weixin.qq.com/pay/unifiedorder";
// // 支付回调页面(异步)   (https://api.mch.weixin.qq.com/pay/unifiedorder)(异步处理支付调用返回数据)
static NSString *const JHPayNotifyURL = @"支付回调页面";

注意:

微信支付的单位为分,整数类型才可以(int)
  • 流程简述
    支付要保证安全性,就要使用加密。微信当然也是这样,微信为了防止中间有人加入窃取信息或者改变价格。有自己的加密方式——生成预支付Id,我们通过封装数据形成XML格式(中间加密)以字符串类型传给微信,获取预支付Id。紧接着,获取以后通过预支付等信息再次加密。APP将参数传给微信,付款成功!回调信息说明支付情况。(关于加密具体怎么实现我会在下面详细说明)。

  • 接入步骤以及代码

1、在做微信支付以前导入:

libc++.tbd
libsqlite3.0.tbd
libz.tbd
SystemConfiguration.framework
CoreTelephony.framework
Security.framework

2、在AppDelegate 的导入头文件 #import "WXApi.h" 挂上代理 WXApiDelegate

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
//这里是你自己写的一些其他代码 实例化window 设置根视图云云
  [WXApi registerApp:@"APPID" withDescription:@"应用描述"];

  } 
 //支付回调
  - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
   return  [WXApi handleOpenURL:url delegate:self];
   }
  - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
   return [WXApi handleOpenURL:url delegate:self];
   }
   #pragma mark 微信回调的代理方法
   - (void)onResp:(BaseResp *)resp {
   if ([resp isKindOfClass:[PayResp class]]) {
   PayResp *response = (PayResp *)resp;
   switch (response.errCode) {
   case WXSuccess:
   NSLog(@"suceess");
   break;
   default:
   NSLog(@"failed");
   break;
   }
   }
   }
如果集成里支付宝以及微信支付等 ,走的回调方法是相同的 ,我们是通过 回调中字符串sourceApplication 进行判断的 例如支付宝支付 为com.alipay.iphoneclient 微信支付为 com.tencent.xin

3、在targets的info中添加 urltypes添加一个在 identifier自己起一个名称(最好软件英文名字) 在 URL schemes 中写下APPID

iOS开发--微信支付接入_第1张图片
1.png

4、触发支付
触发支付,就要对自己的订单号价格等进行加密 在这里就可以分成两种加密 ,一种是在APP端进行加密,第二种是在服务端进行加密。一般使用的在服务端加密比较安全。一个个进行说明。

  • 服务端进行加密
    服务端加密我们不需要知道具体加密怎么进行的。我们只是需要将所需参数传过去 我是用的AFN
 //初始化一个请求管理器
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//接口地址
NSString *urlString = [NSString stringWithFormat:@"%@%@",@"地址头",@"其他"];
//参数字典
NSDictionary *parameters =@{@"fcode": @"账号",
                            @"password": @"密码",@"out_trade_no":@"订单号",@"total_fee":@"金额(分为单位)",@"attach":@"商品详情"};
//post请求
[manager POST:urlString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    //返回状态值1表示成功 0表示失败
    NSString *state=responseObject[@"state"];
   //预支付ID
    NSString *prepayid=responseObject[@"prepayid"];
   //返回文字信息成功或者失败
    NSString *message=responseObject[@"message"];
   //请求数据成功
        if ([state intValue]==1) {
   //支付信息
            PayReq* req             = [[PayReq alloc] init];
   //APPID
            req.openID              = [responseObject objectForKey:@"appid"];
   //商户号
            req.partnerId           = [responseObject objectForKey:@"partnerid"];
   //预支付ID
            req.prepayId            = [responseObject objectForKey:@"prepayid"];
   //时间戳
            req.nonceStr            = [responseObject objectForKey:@"noncestr"];
   //支付类型(为固定字符串:Sign=WXPay)
            req.timeStamp           = [[responseObject objectForKey:@"timestamp"] intValue];
   //加密串
            req.package             = [responseObject objectForKey:@"package"];
   //预支付ID
            req.sign                = [responseObject objectForKey:@"sign"];

            // 发起微信支付
            [WXApi sendReq:req];;

        }
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];

后台没有加密错误,那么会跳转到微信上进行支付。

  • 微信支付成功以后 要通知服务端以及APP端 服务器是通过回调地址进行操作,而对于App端通过Appdelegate中回调函数调用微信代理。
 - (BOOL)application:(UIApplication *)application    handleOpenURL:(NSURL *)url {
   return  [WXApi handleOpenURL:url delegate:self];
  }
  - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
   return [WXApi handleOpenURL:url delegate:self];
   }
   #pragma mark 微信回调的代理方法
 - (void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[PayResp class]]) {
    PayResp *response = (PayResp *)resp;
    NSString *message;
    switch (response.errCode) {
      case WXSuccess:
        {  message=@"支付成功";
            [[NSNotificationCenter defaultCenter] postNotificationName:APP_PAY_SUCCESS object:nil];
        }
            break;
        case WXErrCodeCommon:
         //普通错误类型
            message=@"支付错误";
            break;
        case WXErrCodeUserCancel:
           //用户点击取消并且返回
           message=@"您取消了交易";
            break;
        case WXErrCodeSentFail:
            //发送失败
           message=@"信息发送失败";
            break;
        case WXErrCodeAuthDeny:
           //授权失败
            message=@"授权失败";
            break;
        case WXErrCodeUnsupport:
          //微信不不支持
           message=@"您的微信版本过低";
            break;
        default:
            NSLog(@"failed");
            break;
    }
  }
}

支付成功以后通过通知告知用户支付情况.

  • 支付界面接收成功通知告知用户(我这里是跳转到新的界面)
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appPaySuccess) name:APP_PAY_SUCCESS object:nil];
  • 通知方法
-(void)appPaySuccess{
ZQPaySuccessVC *paySuccessVC=[[ZQPaySuccessVC alloc]init];
[self.navigationController pushViewController:paySuccessVC animated:YES];
}
  • 移除通知(不移除会崩溃呦)
-(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self name:APP_PAY_SUCCESS object:nil];
}

你可能感兴趣的:(iOS开发--微信支付接入)