一泊窘、微信支付儡蔓,首先利用CocoaPods
,導(dǎo)入微信支付SDK
pod 'WechatOpenSDK'
二搓蚪、 創(chuàng)建微信支付管理類(lèi) WechatManager
// WechatManager.h
#import <Foundation/Foundation.h>
#import <WXApi.h>
@interface WechatManager : NSObject
+ (id)shareInstance;
+ (BOOL)handleOpenUrl:(NSURL *)url;
+ (void)hangleWechatPayWith:(PayReq *)req;
@end
// WechatManager.m
#import "WechatManager.h"
@interface WechatManager()<WXApiDelegate>
@end
@implementation WechatManager
+ (id)shareInstance {
static WechatManager *weChatPayInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
weChatPayInstance = [[WechatManager alloc] init];
});
return weChatPayInstance;
}
+ (BOOL)handleOpenUrl:(NSURL *)url {
return [WXApi handleOpenURL:url delegate:[WechatManager shareInstance]];
}
+ (void)hangleWechatPayWith:(PayReq *)req {
[WXApi sendReq:req completion:^(BOOL success) {
if (success) {
NSLog(@"微信支付成功");
} else {
NSLog(@"微信支付異常");
}
}];
}
#pragma mark - 微信支付回調(diào)
- (void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[PayResp class]]) {
/*
enum WXErrCode {
WXSuccess = 0, < 成功
WXErrCodeCommon = -1, < 普通錯(cuò)誤類(lèi)型
WXErrCodeUserCancel = -2, < 用戶點(diǎn)擊取消并返回
WXErrCodeSentFail = -3, < 發(fā)送失敗
WXErrCodeAuthDeny = -4, < 授權(quán)失敗
WXErrCodeUnsupport = -5, < 微信不支持
};
*/
PayResp *response = (PayResp*)resp;
switch (response.errCode) {
case WXSuccess: {
NSLog(@"微信回調(diào)支付成功");
[[NSNotificationCenter defaultCenter] postNotificationName:UserNotificationAlipayOrWechatSuccess
object:nil
userInfo:nil];
break;
}
case WXErrCodeCommon: {
NSLog(@"微信回調(diào)支付異常");
break;
}
case WXErrCodeUserCancel: {
NSLog(@"微信回調(diào)用戶取消支付");
break;
}
case WXErrCodeSentFail: {
NSLog(@"微信回調(diào)發(fā)送支付信息失敗");
break;
}
case WXErrCodeAuthDeny: {
NSLog(@"微信回調(diào)授權(quán)失敗");
break;
}
case WXErrCodeUnsupport: {
NSLog(@"微信回調(diào)微信版本暫不支持");
break;
}
default: {
break;
}
}
}
}
@end
三、在AppDelegate
里面注冊(cè)APPKey
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
LoginCodeViewController *mainViewController = [[LoginCodeViewController alloc] init];
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:mainViewController];
[self.window makeKeyAndVisible];
// 微信支付注冊(cè)
// WeiXinPayKey:APP在微信開(kāi)發(fā)者網(wǎng)站上申請(qǐng)的Key丁鹉。WeiXinLinks:微信開(kāi)發(fā)者Universal Link(這個(gè)有點(diǎn)麻煩妒潭,后面會(huì)詳細(xì)說(shuō)明,先把集成過(guò)程講完)揣钦。
BOOL isSuccess = [WXApi registerApp:WeiXinPayKey universalLink:WeiXinLinks];
if (isSuccess) {
NSLog(@"微信支付API注冊(cè)成功");
} else {
NSLog(@"微信支付API注冊(cè)失敗");
} return YES;
}
四雳灾、補(bǔ)充說(shuō)明:WeiXinPayKey:APP在微信開(kāi)發(fā)者網(wǎng)站上申請(qǐng)的Key。WeiXinLinks:是微信開(kāi)發(fā)者的Universal Link(通用鏈接),
- 該鏈接一般為以
https
開(kāi)頭的公司域名冯凹; - 開(kāi)發(fā)者中心配置谎亩,配置App ID支持Associated Domains:
配置開(kāi)發(fā)者中心支持Associated Domains.png
- Xcode工程配置
- 在工程里 -
Capabilities
里面打開(kāi)Associated Domains
開(kāi)關(guān),配置內(nèi)容為以下格式:
applinks:www.baidu.com
Xcode配置.jpg
- 在工程里 -
Info
里面新建LSApplicationQueriesSchemes
數(shù)組,配置內(nèi)容為以下格式:
LSApplicationQueriesSchemes.png
- 配置指定文件宇姚,這個(gè)文件名必須為
apple-app-site-association
匈庭,切記沒(méi)有后綴名,文件內(nèi)容如下:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "Xcode項(xiàng)目的Bundle Identifier",
"paths": [ "*" ]
}
]
}
}
- 上傳上一步新建的文件到域名根目錄下:
- 上傳該文件到你的域名所對(duì)應(yīng)的根目錄或者.well-known目錄下浑劳,這是為了蘋(píng)果能獲取到你上傳的文件阱持。
五、APPDelegate
處理支付SDK
回調(diào)
#pragma mark - 微信支付配置返回 url處理方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
if ([url.scheme containsString:WeiXinPayKey]) {
if ([url.absoluteString containsString:[NSString stringWithFormat:@"%@://pay", WeiXinPayKey]]) {
return [WechatManager handleOpenUrl:url];
} else if ([url.absoluteString containsString:[NSString stringWithFormat:@"%@://oauth?", WeiXinPayKey]]) {
return [WechatManager handleOpenUrl:url];
}
}
return YES;
}
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
NSURL *continueURL = userActivity.webpageURL;
NSString *relativePath = continueURL.relativePath;
if ([relativePath containsString:WeiXinPayKey] && [relativePath containsString:@"pay"]) {
return [WXApi handleOpenUniversalLink:userActivity delegate:[WechatManager shareInstance]];
} else if ([relativePath containsString:[NSString stringWithFormat:@"%@", WeiXinPayKey]]) {
return [WXApi handleOpenUniversalLink:userActivity delegate:[WechatShareManager shareInstance]];
}
return YES;
}
六魔熏、URL-Types
配置衷咽,這個(gè)schems
就是微信開(kāi)發(fā)者平臺(tái)注冊(cè)的APPKey
URLType配置.jpg
七、調(diào)用支付接口,處理微信支付后處理通知
- 在支付界面控制器蒜绽,添加通知
- (void)viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(ailyPayOrWechatSuccessAction)
name:UserNotificationAlipayOrWechatSuccess
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(ailyPayOrWechatFailAction)
name:UserNotificationAlipayOrWechatFail
object:nil];
}
- 書(shū)寫(xiě)支付結(jié)果通知回調(diào)方法镶骗, 然后對(duì)通知的函數(shù)進(jìn)行處理
#pragma mark - 利用通知處理支付結(jié)果
// 支付成功
- (void)ailyPayOrWechatSuccessAction {
// 處理支付結(jié)果
NSLog(@"處理支付成功結(jié)果");
}
// 支付失敗
- (void)ailyPayOrWechatFailAction {
NSLog(@"處理支付失敗結(jié)果");
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- 創(chuàng)建訂單,創(chuàng)建成功后拿到后臺(tái)返回的信息躲雅,然后調(diào)用微信支付
#pragma mark - 確認(rèn)支付
- (void)userBuyGoodsAction {
// @param address_id 地址ID
// @param count 商品數(shù)量
// @param refer_id 商品ID
// @param refer_type 商品類(lèi)型 0課程 1直播
// @param type 支付類(lèi)型 0微信 1支付寶
// @param coupon_id 優(yōu)惠券ID
// @param handle 返回簽名
int type = self.isWeixinPay ? 0 : 1;
[HttpManager createOrderWithAddressId:self.locationModel.location_id count:@(1) refer_id:self.lessonModel.ID refer_type:@(0) type:@(type) coupon_id:nil andHandle:^(NSString *error, NSDictionary *result) {
if (error == nil) {
NSLog(@"微信支付創(chuàng)建訂單回執(zhí)-%@",result);
NSDictionary *dict = [self jsonToDictionary:result[@"data"][@"data"]];
PayReq *req = [[PayReq alloc] init];
req.nonceStr = [dict objectForKey:@"noncestr"];
req.timeStamp = [[dict objectForKey:@"timestamp"] intValue];
req.package = [dict objectForKey:@"package"];
req.partnerId = [dict objectForKey:@"partnerid"];
req.prepayId = [dict objectForKey:@"prepayid"];
req.sign = [dict objectForKey:@"sign"];
[WechatManager hangleWechatPayWith:req];
} else {
NSLog(@"訂單創(chuàng)建失敗,失敗原因-%@",result);
}
}];
}