[iOS]关于微信支付

一,前期准备:

1.到微信的开放平台注册账号:https://open.weixin.qq.com

2.进入管理中心--->移动应用--->创建移动应用:根据提示完善应用资料

3.审核通过后,进入应用详情页,查看应用详情,这里可以查看AppID和AppSecret以及一些接口信息

应用创建时,是没有支付能力的,需要额外申请,具体的申请过程,根据网页提示,一步一步完善资料,等待审核;审核通过后,会给你发一个邮件,邮件中包含与支付能力相关的微信商户号的信息,到微信的商户平台https://pay.weixin.qq.com,完善资料,验证银行账号;即获得了支付能力...


二,适配iOS9

在iOS9下,系统会拦截对HTTP协议接口的访问,因此无法获取HTTP协议接口的数据,控制台会输出如下信息:

2016-02-29 15:42:35.765 LQQWeChatDemo[3228:740276] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
2016-02-29 15:42:35.769 LQQWeChatDemo[3228:740247] Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSErrorFailingURLStringKey=http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php, NSErrorFailingURLKey=http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection., NSUnderlyingError=0x145826d0 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSErrorFailingURLKey=http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php, NSErrorFailingURLStringKey=http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.}}}


解决方案(以下方法2选1)

 1.暂时全部回退到HTTP协议

具体方法:

在项目的info.plist中添加一个Key:NSAppTransportSecurity,类型为字典类型。

然后给它添加一个Key:NSAllowsArbitraryLoads,类型为Boolean类型,值为YES;


2.设置域,把不支持HTTPS协议的接口设置成HTTP的接口

具体方法:

1)、在项目的info.plist中添加一个Key:NSAppTransportSecurity,类型为字典类型。

2)、然后给它添加一个NSExceptionDomains,类型为字典类型;

3)、把需要的支持的域添加給NSExceptionDomains。其中域作为Key,类型为字典类型。

4)、每个域下面需要设置3个属性:NSIncludesSubdomains、NSExceptionRequiresForwardSecrecy、NSExceptionAllowsInsecureHTTPLoads。

均为Boolean类型,值分别为YES、NO、YES。



平台设置域

新浪微博

  • weibo.com
  • weibo.cn
  • sina.com.cn

腾讯微博

  • qq.com

微信

  • qq.com

QQ/QZone

  • qq.com

方式二设置的需要把所有不支持HTTPS的接口都设置一遍,如果项目中都是HTTP协议的接口,可使用方式一,直接回退到HTTP,就不用单个设置了.


三,导入微信SDK

到微信开放平台下载最新的SDK,下载之后导入文件:libWeChatSDK.a,WXApi.h,WXApiObject.h到你的工程中

添加依赖库:SystemConfiguration.framework,liz.tbd,libsqlite3.0.tbd,libc++.tbd


设置URL scheme



编译运行,如果报以下错误:

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_CTTelephonyNetworkInfo", referenced from:
      objc-class-ref in libWeChatSDK.a(MTAHelper.o)
这是因为还需要导入库文件:CoreTelephony.framework


PS:如果项目中使用了ShareSDK,可以直接使用ShareSDK导入的微信SDK,ShareSDK是支持cocoa pods的,只需在Podfile文件中加入:

pod 'ShareSDK3'
pod 'ShareSDK3/ShareSDKPlatforms/WeChat'

使用cocoa pods的好处就不用说了...


四,使用微信的API

在需要使用微信支付的地方导入:

#import "WXApi.h"
1.在AppDelegate中的didFinishLaunchingWithOptions方法中添加以下代码向微信注册APP:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    //注册APP,
    [WXApi registerApp:@"wxb4ba3c02aa476ea1"];
    return YES;
}


然后,重写以下两个方法:

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
    // 跳转到URL scheme中配置的地址
    //NSLog(@"跳转到URL scheme中配置的地址-->%@",url);
    return [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];
}
//支付成功时调用,回到第三方应用中
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    //    NSLog(@"****************url.host -- %@",url.host);
    if ([url.scheme isEqualToString:@"wx23a1f7f291ef4b3d"])
    {
        return  [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];
    }
    return YES;
}


添加微信的支付结果回调方法:

//微信回调,有支付结果的时候会回调这个方法
- (void)onResp:(BaseResp *)resp
{  
    //    支付结果回调
    if([resp isKindOfClass:[PayResp class]]){
        
        switch (resp.errCode) {
            case WXSuccess:{
                
                //支付返回结果,实际支付结果需要去自己的服务器端查询
                NSNotification *notification = [NSNotification notificationWithName:@"ORDER_PAY_NOTIFICATION" object:@"success"];
                [[NSNotificationCenter defaultCenter] postNotification:notification];
                
                break;
            }
            default:{
                NSNotification *notification = [NSNotification notificationWithName:@"ORDER_PAY_NOTIFICATION"object:@"fail"];
                [[NSNotificationCenter defaultCenter] postNotification:notification];
                break;
            }
        }
    }
}

这里微信的支付结果是通过发送通知的方式告诉吊起微信的控制器的...


2.吊起微信

在吊起微信的地方注册通知(用于接收支付结果)的时候,最好先判断一下用户是否安装了微信:

//判断是否安装微信 
if([WXApi isWXAppInstalled]) {
        // 监听一个通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getOrderPayResult:) name:@"ORDER_PAY_NOTIFICATION" object:nil];
  }

吊起微信所需的参数配置可参考官方提供的一个连接:http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php,用于调试支付接口

这里所获取到的参数可以全部由服务器提供,即在服务器返回prepayId的时候,一并将吊起微信所需的参数返回,

[Networking getWithUrl:@"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php" params:nil success:^(id response) {
        NSLog(@"%@",response);
        
        //配置调起微信支付所需要的参数
        
        PayReq *req  = [[PayReq alloc] init];
        
        req.partnerId = [response objectForKey:@"partnerid"];
        req.prepayId = [response objectForKey:@"prepayid"];
        req.package = [response objectForKey:@"package"];
        req.nonceStr = [response objectForKey:@"noncestr"];
        req.timeStamp = [[response objectForKey:@"timestamp"]intValue];
        req.sign = [response objectForKey:@"sign"];
        
        //调起微信支付
        if ([WXApi sendReq:req]) {
            NSLog(@"吊起成功");
        }

        
    } fail:^(NSError *error) {
        NSLog(@"%@",error);
    }];


然后实现通知方法,在这里获取支付结果,处理相关逻辑:

#pragma mark - 收到支付成功的消息后作相应的处理
- (void)getOrderPayResult:(NSNotification *)notification
{
    if ([notification.object isEqualToString:@"success"]) {
        NSLog(@"支付成功");
    } else {
        NSLog(@"支付失败");
    }

}

到此,一个简单的支付流程就完成了...
完整demo可直接运行,吊起微信支付



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值