微信在很多项目中都可能用到,所以掌握微信支付是非常非常有必要,下面就简单的介绍微信支付的两种方法。
第一种,把相应的参数传给后台,后台返回关于微信支付的相关参数,我们拿到这些参数去完成支付,这种方法相对比较简单,但也最常用。
首先你必须有和微信支付相关的appid,记住这个appid和微信分享的appid是两码事。
然后配置工程。
一、libWeChatSDK.a、WXApi.h、WXApiObject.h三个文件导入工程中,下载地址:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1
二、导入系统库TARGETS>>Build Phases>>Link Binary With Libraries点击“+”一次添加下面的系统库
CoreTelephony.framework、
Security.framework、
SystemConfiguration.framework、
UIKit.framework、
Foundation.framework、
CoreGraphics.framework、
libsqlite3.tcd、
libz.tbd、
三、项目注册微信支付、配置白名单、支付回调
注册
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[WXApi registerApp:APP_KEY withDescription:@"微信测试"];//记得配置白名单
return YES;
}
代理回调<WXApiDelegate>
-(BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(nonnull id)annotation{
if ([url.host isEqualToString:@"pay"]) {
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
-(BOOL)application:(UIApplication *)app handleOpenURL:(nonnull NSURL *)url{
if ([url.host isEqualToString:@"pay"]) {
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
-(void)onResp:(BaseResp *)resp{
NSString *strTitle;
if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
strTitle = [NSString stringWithFormat:@"发送媒体消息结果"];
}
if ([resp isKindOfClass:[PayResp class]]) {
strTitle = [NSString stringWithFormat:@"支付结果"];
switch (resp.errCode) {
case WXSuccess:
{
NSLog(@"支付结果: 成功!");
}
break;
case WXErrCodeCommon:
{ //签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
NSLog(@"支付结果: 失败!");
}
break;
case WXErrCodeUserCancel:
{ //用户点击取消并返回
NSLog(@"用户点击取消并返回");
}
break;
case WXErrCodeSentFail:
{ //发送失败
NSLog(@"发送失败");
}
break;
case WXErrCodeUnsupport:
{ //微信不支持
NSLog(@"微信不支持");
}
break;
case WXErrCodeAuthDeny:
{ //授权失败
NSLog(@"授权失败");
}
break;
default:
break;
}
//------------------------
}
}
白名单配置
TARGETS>>info>>URL Types>>“+”>>URL Schemes 粘贴上appid
最后,准备就绪,把相应的参数传给后台,后台返回关于微信支付的相关参数,我们拿到这些参数去完成支付,当然参数的处理必需要和后台商量好。(调起微信支付前判断用户是否装了微信客户端)
//调起微信支付
PayReq* req = [[PayReq alloc] init];
req.partnerId = [dict objectForKey:@"partnerId"];//商户号,
req.prepayId = [dict objectForKey:@"prepayId"];//包含了商品的所有信息
req.nonceStr = [dict objectForKey:@"nonceStr"];//随机字符串
req.timeStamp = stamp.intValue;//时间戳
req.package = [dict objectForKey:@"package"];@"Sign=WXPay"固定不变
req.sign = [dict objectForKey:@"sign"];//签名
[WXApi sendReq:req];
至此,不出意外的话,微信支付就差不多了。