iOS 微信支付和 Universal Link
准备工作:
1.https服务器。
2.在微信开放平台创建应用,申请支付功能,获取App ID。
开始对接支付功能:
第一步:安装sdk
打开Xcode,通过Pod安装微信SDK:
pod 'WechatOpenSDK'
pod install
第二步:项目配置
2.1:配置 URL Types
image2.2:info.plist 添加白名单,weixin、weixinULAPI
image2.3:打开苹果开发者网站(http://developer.apple.com),勾选 Associated Domains。
image2.4:Xcode中,在 Capability 中添加 Associated Domains,Domains:填写【applinks:域名】,如
image
第三步:配置 Universal Link(通用链接)
创建空白文本,命名为apple-app-site-association(无后缀),
内容如:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "2EX886S24H.com.ZXKJ.Maintenance",
"paths": ["/app/*"]
}
]
}
}
说明:appID填写格式: "TeamID.Bundle ID",“苹果账号团队ID.BundleID”
文件交给后台程序员,上传至根目录或 .well-known 目录下。形成链接后,可下载即成功。
https://cloud.xxxxxx.com/.well-known/apple-app-site-association
⚠️⚠️⚠️ Universal Links 配置举🌰
假设域名为:https://www.mydomain.com
1.微信开放平台设置为:
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 中导入头文件
#import "WXApi.h"
: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中加入代码:
//微信调试代码
/*
[WXApi startLogByLevel:WXLogLevelDetail logBlock:^(NSString *log) {
NSLog(@"WeChatSDK: %@", log);
}];
*/
/* 微信 */
BOOL success = [WXApi registerApp:WeChat_AppKey universalLink:WeChat_universalLink];
if (success) {
NSLog(@"微信 registerApp success!");
}
//调用自检函数,调试代码
/*
[WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
NSLog(@"WeChatSDK step = %@, %u, %@, %@ result=%@", @(step), result.success, result.errorInfo, result.suggestion, result);
}];
*/
👇不能少!否则无法调起微信
#pragma mark - 设置系统回调
// 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;
// 回调
- (BOOL)handleOpenURL:(NSURL *)url;
// 回调 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;
}
// 回调
- (BOOL)handleOpenURL:(NSURL *)url {
if ([[url absoluteString] rangeOfString:[NSString stringWithFormat:@"%@://pay/", WeChat_AppKey]].location == 0) {
return [WXApi handleOpenURL:url delegate:self];
}
return NO;
}
// 回调 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回调方法
- (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
支付页面调用工具类:
- (void)wxPay {
NSDictionary *data = @{
@"appId" : @"wx862e7a21b8df70b7",
@"nonceStr" : @"li8tjxvshpxcmryefu8b87xftdf4ljnn",
@"partnerId": @"1611925030",
@"prepayId" : @"wx0913444284359740c9002e4995965f0000",
@"sign" : @"03359D5970F910EE5609E7BB4CA52DA8",
@"timeStamp": @"1631166282"
};
[WXTools doWXPay:data paySuccess:^{
NSLog(@"success!");
} payFailed:^{
NSLog(@"支付失败");
}];
}
说明
⚠️⚠️⚠️ 全部配置完后,如果微信调用不起来,使用SDK 自检函数排查问题
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接入和配置都没有问题。