1、项目设置APPID
首先在微信开放平台申请开发APP应用,获取唯一标识APPID。在Xcode中打开项目,在info->URL Types进行设置,如下图
2、注册APPID
在你的APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:
[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
3、调起支付
后台服务器生成支付订单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:
//微信调起支付
//url是服务器返回的订单信息,WXPayModel是我自己定义的订单数据模型
- (void)wxPayRequest:(NSString *)url{
NSData *jsonData = [url dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
WXPayModel *model = [WXPayModel mj_objectWithKeyValues:dic];
//需要创建这个支付对象
PayReq *req = [[PayReq alloc] init];
// 商家id,在注册的时候给的
req.partnerId = model.partnerid;
// 预支付订单
req.prepayId = model.prepayid;
// 固定的,只能是即req.package = Sign=WXPay
req.package = model.package;
// 随机编码,为了防止重复的,在后台生成
req.nonceStr = model.noncestr;
// 时间戳,也是在后台生成的,为了验证支付的
req.timeStamp = model.timestamp.intValue;
// 这个签名也是后台做的
req.sign = model.sign;
//发送请求到微信,等待微信返回onResp
if ([WXApi sendReq:req]) {
NSLog(@"吊起成功");
} else {
NSLog(@"吊起失败");
}
}
4、支付结果回调
//微信结果回调
- (void)onResp:(BaseResp *)resp{
if ([resp isKindOfClass:[PayResp class]]) {
PayResp * response = (PayResp *)resp; // 微信终端返回给第三方的关于支付结果的结构体
switch (response.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;
}
}
5、注意
//AppDelegate文件中的该方法中调用如下方法,否则微信不会走支付回调
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
if ([url.host isEqualToString:@"pay"]) {
return [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];
}
return NO;
}