準(zhǔn)備工作:
1.https服務(wù)器。
2.在微信開放平臺(tái)創(chuàng)建應(yīng)用朴乖,申請支付功能祖屏,獲取App ID助赞。
開始對接支付功能:
第一步:安裝sdk
打開Xcode,通過Pod安裝微信SDK:
pod 'WechatOpenSDK'
pod install
第二步:項(xiàng)目配置
2.1:配置 URL Types
2.2:info.plist 添加白名單赐劣,weixin嫉拐、weixinULAPI
2.3:打開蘋果開發(fā)者網(wǎng)站(http://developer.apple.com),勾選 Associated Domains魁兼。
2.4:Xcode中婉徘,在 Capability 中添加 Associated Domains,Domains:填寫【applinks:域名】咐汞,如
第三步:配置 Universal Link(通用鏈接)
創(chuàng)建空白文本盖呼,命名為apple-app-site-association(無后綴),
內(nèi)容如:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "2EX886S24H.com.ZXKJ.Maintenance",
"paths": ["/app/*"]
}
]
}
}
說明:appID填寫格式: "TeamID.Bundle ID"化撕,“蘋果賬號(hào)團(tuán)隊(duì)ID.BundleID”
文件交給后臺(tái)程序員几晤,上傳至根目錄或 .well-known 目錄下。形成鏈接后植阴,可下載即成功蟹瘾。
https://cloud.xxxxxx.com/.well-known/apple-app-site-association
?????? Universal Links 配置舉??
假設(shè)域名為:https://www.mydomain.com
1.微信開放平臺(tái)設(shè)置為:
2.apple-app-site-association 配置文件:
{
"appID": "2EX886S24H.com.ZXKJ.Maintenance",
"paths": ["/app/*"]
}
3.在 Xcode -> Targets -> Signing & Capability -> Associated Domains,Domains 填寫:
4.Xcode中代碼配置為:
[WXApi registerApp:@"App Id" universalLink:@"https://www.mydomain.com/app/"];
第四步:微信支付代碼
AppDelegate.m 中導(dǎo)入頭文件
#import "WXApi.h"
: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中加入代碼:
//微信調(diào)試代碼
/*
[WXApi startLogByLevel:WXLogLevelDetail logBlock:^(NSString *log) {
NSLog(@"WeChatSDK: %@", log);
}];
*/
/* 微信 */
BOOL success = [WXApi registerApp:WeChat_AppKey universalLink:WeChat_universalLink];
if (success) {
NSLog(@"微信 registerApp success!");
}
//調(diào)用自檢函數(shù)掠手,調(diào)試代碼
/*
[WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
NSLog(@"WeChatSDK step = %@, %u, %@, %@ result=%@", @(step), result.success, result.errorInfo, result.suggestion, result);
}];
*/
??不能少憾朴!否則無法調(diào)起微信
#pragma mark - 設(shè)置系統(tǒng)回調(diào)
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
BOOL result_wechat = [WXTools handleOpenURL:url];
if (result_wechat) {
return result_wechat;
}
return NO;
}
// Universal Link(通用鏈接)
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
BOOL result_wechat = [WXTools handleOpenUniversalLink:userActivity];
if (result_wechat) {
return result_wechat;
}
return NO;
}
微信支付工具類:
WXPayTools.h
#import <Foundation/Foundation.h>
#import "WXApi.h"
#define WXTools [WXPayTools sharedInstance]
#define WeChat_AppKey @""
@interface WXPayTools : NSObject
+ (WXPayTools *)sharedInstance;
// 回調(diào)
- (BOOL)handleOpenURL:(NSURL *)url;
// 回調(diào) Universal Link(通用鏈接)
- (BOOL)handleOpenUniversalLink:(NSUserActivity *)userActivity;
/** wechat支付 */
- (void)doWXPay:(NSDictionary *)reqDict paySuccess:(void (^)(void))paySuccessBlock payFailed:(void (^)(void))payFailedBlock;
@end
WXPayTool.m
#import "WXPayTools.h"
@interface WXPayTools ()<WXApiDelegate>
@property (nonatomic, copy) void (^authSuccessBlock)(NSString *reqCode);
@property (nonatomic, copy) void (^paySuccessBlock)(void);
@property (nonatomic, copy) void (^payFailedBlock)(void);
@end
@implementation WXPayTools
+ (WXPayTools *)sharedInstance {
static WXPayTools *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [WXPayTools new];
});
return instance;
}
// 回調(diào)
- (BOOL)handleOpenURL:(NSURL *)url {
if ([[url absoluteString] rangeOfString:[NSString stringWithFormat:@"%@://pay/", WeChat_AppKey]].location == 0) {
return [WXApi handleOpenURL:url delegate:self];
}
return NO;
}
// 回調(diào) Universal Link(通用鏈接)
- (BOOL)handleOpenUniversalLink:(NSUserActivity *)userActivity {
return [WXApi handleOpenUniversalLink:userActivity delegate:self];
}
/** wechat支付 */
- (void)doWXPay:(NSDictionary *)dataDict paySuccess:(void (^)(void))paySuccessBlock payFailed:(void (^)(void))payFailedBlock; {
self.paySuccessBlock = paySuccessBlock;
self.payFailedBlock = payFailedBlock;
if ([dataDict isKindOfClass:[NSDictionary class]]) {
PayReq *request = [[PayReq alloc] init];
request.partnerId = dataDict[@"partnerId"];
request.prepayId = dataDict[@"prepayId"];
request.package = @"Sign=WXPay";
request.nonceStr = dataDict[@"nonceStr"];
request.timeStamp = [dataDict[@"timeStamp"] intValue];
request.sign = dataDict[@"sign"];
[WXApi sendReq:request completion:^(BOOL success) {
NSLog(@"success - %d", success);
}];
}
}
#pragma mark - Delegate回調(diào)方法
- (void)onResp:(id)resp {
if ([resp isKindOfClass:[PayResp class]]) {
PayResp *response = (PayResp *)resp;
switch(response.errCode) {
case WXSuccess: {
NSLog(@"支付成功");
if (self.paySuccessBlock) {
self.paySuccessBlock();
}
} break;
default: {
NSLog(@"支付失敗");
if (self.payFailedBlock) {
self.payFailedBlock();
}
} break;
}
}
}
@end
支付頁面調(diào)用工具類:
- (void)wxPay {
NSDictionary *data = @{
@"appId" : @"wx862e7a21b8df70b7",
@"nonceStr" : @"li8tjxvshpxcmryefu8b87xftdf4ljnn",
@"partnerId": @"1611925030",
@"prepayId" : @"wx0913444284359740c9002e4995965f0000",
@"sign" : @"03359D5970F910EE5609E7BB4CA52DA8",
@"timeStamp": @"1631166282"
};
[WXTools doWXPay:data paySuccess:^{
NSLog(@"success!");
} payFailed:^{
NSLog(@"支付失敗");
}];
}
說明
?????? 全部配置完后喷鸽,如果微信調(diào)用不起來众雷,使用SDK 自檢函數(shù)排查問題
WeChatSDK step = 0, 1, check passed,
WeChatSDK step = 1, 1, check passed,
WeChatSDK step = 2, 1, check passed,
WeChatSDK step = 3, 1, check passed,
WeChatSDK step = 4, 1, check passed,
WeChatSDK step = 5, 1, Universal Link check passed. The application is launched by WeChat via Universal Link,
WeChatSDK step = 6, 1, All Check Passed!,
step 6 走完,說明sdk接入和配置都沒有問題做祝。