写在前面
微信支付经过这几年改进,变得越来越容易上手,对新手来说简直就是傻瓜式集成。本文就是对微信支付集成的逐步分析,按照步骤来基本上都没什么问题。
一、集成sdk
使用cocoaPods集成sdk到项目中
pod 'WechatOpenSDK'
在
PrefixHeader.pch
文件中引入头文件
#import "WXApi.h"
二、AppDelegate内操作
注:本步所有操作均在AppDelegate内
-
在
AppDelegate
中遵循微信WXApiDelegate
在
didFinishLaunchingWithOptions
中注册微信
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[WXApi registerApp:@"你的appID"];
}
- 编辑支付回调
#pragma mark---- 各种回调返回结果
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
//iOS 8 及以下
return [WXApi handleOpenURL:url delegate:self];
return YES ;
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
//iOS 9 及以上
if ([url.host isEqualToString:@"safepay"]) {
//这里是支付宝回调
}else{
[WXApi handleOpenURL:url delegate:self];
}
return YES;
}
#pragma mark - 微信支付回调
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
return [WXApi handleOpenURL:url delegate:self];
}
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp
{
if([resp isKindOfClass:[PayResp class]]){
switch (resp.errCode) {
case WXSuccess://支付成功回调写通知在支付界面接受通知
[[NSNotificationCenter defaultCenter] postNotificationName:YAKE_RECHARGE_SUCCESSFUL object:nil];
break;
default://支付失败回调写通知在支付界面接受通知
[[NSNotificationCenter defaultCenter] postNotificationName:YAKE_RECHARGE_FAIL object:nil];
break;
}
}
}
-
编辑URL Types
看下图即可
三、调起支付
在需要使用微信支付的地方请求接口,后台会返回支付微信支付所需要的参数我们将这些参数传给微信然后调用就OK了
这里是代码
NSDictionary *dict = result.obj;
//调起微信支付
PayReq* req = [[PayReq alloc] init];
req.partnerId = [dict objectForKey:@"partnerId"];
req.prepayId = [dict objectForKey:@"prepayId"];
req.nonceStr = [dict objectForKey:@"nonceStr"];
req.timeStamp = [[dict objectForKey:@"timeStamp"] intValue];
req.package = [dict objectForKey:@"packageValue"];
req.sign = [dict objectForKey:@"sign"];
[WXApi sendReq:req];
四、接受支付成功或失败通知
在支付界面viewDidLoad中接收通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(paySucessfulNoti:) name:YAKE_RECHARGE_SUCCESSFUL object:nil];
通知要进行的事件
#pragma mark--- 支付成功通知
- (void)paySucessfulNoti:(NSNotification *)noti {
//可以在这里做一些支付完成需要做的事情,比如刷新界面数据等
[self httpPayCheck];//支付完成校验
}
当然不要忘了移除通知
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:YAKE_RECHARGE_SUCCESSFUL object:nil];
}
五、结束
是不是不可思议,就是这么简单就能调用了
我在开发过程中遇到一个问题提示支付签名验证失败
问题解决原来是后台签名弄错了,不过我们移动端也要注意传值的时候别传错,特别是时间戳格式。