最近有了点时间整理一下最新的微信支付接入的主要事项,以免后面踩坑。
我这里写的是把主要业务逻辑都放后台实现的方法,移动端直接调接口就行了,也是官方推荐的方法。
关于支付宝支付
先上官方文档:
APP端开发步骤官方文档
iOS接入指南官方文档
下面这个是自己关于Universal Links的一点小总结
关于Universal Links
三个结合一起看应该就没得啥大问题了。下面是一些代码方面的补充。
先到微信开放平台-管理中心-应用详情,获取一些之前注册后生成的数据。
如图:
![](https://img.haomeiwen.com/i2484563/d2dfb8c0c91835a0.png)
![](https://img.haomeiwen.com/i2484563/6978965e2e9712a4.png)
在添加好白名单,Universal Links,Url Schemes之后就可以开始写代码了。
在 1:AppDelegate 的 didFinishLaunchingWithOptions 函数中向微信注册 id
#import <UIKit/UIKit.h>
#import "WXApi.h"
@interface AppDelegate : UIResponder<UIApplicationDelegate, WXApiDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//向微信注册
//[WXApi registerApp:您的APP_ID enableMTA:YES];//sdk:1.8.6-
[WXApi registerApp:您的APP_ID universalLink:您的UNIVERSAL_LINK];//sdk:1.8.6+
return YES;
}
2:重写 AppDelegate 的 handleOpenURL 和 openURL 方法:
//ios9之后已经弃用
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [WXApi handleOpenURL:url delegate:self];
}
/**
iOS9以后该方法已经废弃,用一下方法替代
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [WXApi handleOpenURL:url delegate:self];
}
*/
//iOS9之后的的方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
{
return [WXApi handleOpenURL:url delegate:self];
}
3:重写AppDelegate或SceneDelegate的continueUserActivity方法: 注意:适配了SceneDelegate的App,系统将会回调SceneDelegate的continueUserActivity方法,所以需要重写SceneDelegate的该方法。(微信支付SDK1.8.6+才调用这个代理方法)
//AppDelegate:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
return [WXApi handleOpenUniversalLink:userActivity delegate:self];
}
/**
SceneDelegate:中调用
*/
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
[WXApi handleOpenUniversalLink:userActivity delegate:self];
}
4:现在,你的程序要实现和微信终端交互的具体请求与回应,因此需要实现 WXApiDelegate 协议的两个方法:
-(void) onReq:(BaseReq*)reqonReq
{
NSlog(@"微信支付回调");
}
/**照微信SDK Sample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意 一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下
0:成功,成功展示页面
-1:错误,可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2:用户取消,无需处理。发生场景:用户不支付了,点击取消,返回APP。
*/
-(void)onResp:(BaseResp*)resp{
if ([respisKindOfClass:[PayRespclass]]){
PayResp*response=(PayResp*)resp;
switch(response.errCode){
caseWXSuccess:
//服务器端查询支付通知或查询API返回的结果再提示成功
NSlog(@"支付成功");
break;
default:
NSlog(@"支付失败,retcode=%d",resp.errCode);
break;
}
}
}
然后你代码中业务逻辑的位置
1:想后台提交支付清单获取订单编号:orderNo
2:点击微信支付按钮的时候判断是否安装了微信
if (![WXApi isWXAppInstalled]) {//未安装支付
[self showAlert:@"您还为安装微信"];
}else{//已经安装微信
//继续进行微信支付,给后台传订单号
}
3:给后台传订单编号:orderNo,获取微信支付相关数据:PayReq。
/*! @brief 第三方向微信终端发起支付的消息结构体
*
* 第三方向微信终端发起支付的消息结构体,微信终端处理后会向第三方返回处理结果
* @see PayResp
*/
@interface PayReq : BaseReq
/** 商家向财付通申请的商家id */
@property (nonatomic, copy) NSString *partnerId;
/** 预支付订单 */
@property (nonatomic, copy) NSString *prepayId;
/** 随机串,防重发 */
@property (nonatomic, copy) NSString *nonceStr;
/** 时间戳,防重发 */
@property (nonatomic, assign) UInt32 timeStamp;
/** 商家根据财付通文档填写的数据和签名 */
@property (nonatomic, copy) NSString *package;
/** 商家根据微信开放平台文档对数据做的签名 */
@property (nonatomic, copy) NSString *sign;
@end
4:唤起支付界面开始支付
#pragma mark - 调起微信支付页面
- (void)sendWeiChatPay
{
//接收后台传回的数据后,装入model,将model中的数据传给req
PayReq* req = [[PayReq alloc] init];
req.partnerId = self.model.partnerid;/** 商家向财付通申请的商家id */
req.prepayId = self.model.prepayid;/** 预支付订单 */
req.nonceStr = self.model.noncestr;/** 随机串,防重发 */
NSString *str = self.model.timeStamp;//NSString 转 UInt32
UInt32 num;
sscanf([str UTF8String], "%u", &num);
req.timeStamp = num;/** 时间戳,防重发,UInt32类型 */
req.package = self.model.package;/** 商家根据财付通文档填写的数据和签名 */
req.sign = self.model.sign;/** 商家根据微信开放平台文档对数据做的签名 */
/*两个自检函数,测完没得问题就注释掉,这里有个坑,这两个自检函数如果和调起微信支付函数同时存在的话,支付结果会返回“未知的应用请求”导致支付不成功
[WXApi startLogByLevel:WXLogLevelDetail logBlock:^(NSString *log) {
NSLog(@"WeChatSDK+++++++++++: %@", log);
}];
//调用自检函数
[WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
NSLog(@"step-----: %@, result.success---------: %u, result.errorInfo-------: %@, result.suggestion-----: %@", @(step), result.success, result.errorInfo, result.suggestion);
}];
*/
[WXApi sendReq:req];//调起微信支付1.8.6-
/*调起微信支付1.8.6+
[WXApi sendReq:req completion:^(BOOL success) {
if (success) {
PHlog(@"--------: %@",@"支付成功");
}else{
PHlog(@"--------: %@",@"失败");
}
}];
*/
}
最后向后台确认支付结果。
需要swift版本的请参考swift版本
网友评论