微信、支付宝支付SDK安装
添加podFile文件
若还未使用cocoaPads的同学可以去微信支付宝的开放平台去下载相关的SDK,相关地址放在下面了
pod 'WechatOpenSDK'
pod 'AlipaySDK-iOS'
环境配置
- 微信支付
添加URLTypes
> 单击项目 -> Info -> URL Types,URL Schemes为APPID
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gNTT30pa-1590415090409)(http://blog.ailschn.com/upload/2019/9/15500200-10980e50830859dc-fdcf531151d5430a9d1f84026690d2b5.png)]
- 支付宝支付
同微信,新添加一个URLTypes,URLSchemes 需设置唯一字符串
支付类整合
直接上代码
- AppDelegate.m
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if ([url.host isEqualToString:@"safepay"]) {
// 支付跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
[[PayManagger shareManage] alipayResp:resultDic];
}];
// 授权跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
// 解析 auth code
NSString *result = resultDic[@"result"];
NSString *authCode = nil;
if (result.length>0) {
NSArray *resultArr = [result componentsSeparatedByString:@"&"];
for (NSString *subResult in resultArr) {
if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
break;
}
}
}
NSLog(@"授权结果 authCode = %@", authCode?:@"");
}];
}
return YES;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
if ([url.host isEqualToString:@"safepay"]) {
// 支付跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
// NSLog(@"result = %@",resultDic);
[[PayManagger shareManage] alipayResp:resultDic];
}];
// 授权跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
// 解析 auth code
NSString *result = resultDic[@"result"];
NSString *authCode = nil;
if (result.length>0) {
NSArray *resultArr = [result componentsSeparatedByString:@"&"];
for (NSString *subResult in resultArr) {
if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
break;
}
}
}
NSLog(@"授权结果 authCode = %@", authCode?:@"");
}];
}
return YES;
}
- PayManagger.h
//
// PayManagger.h
// JY
//
// Created by 王杰 on 2020/02/21.
// Copyright © 2020 zrgj. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <AlipaySDK/AlipaySDK.h>
#import <WechatOpenSDK/WXApi.h>
typedef NS_ENUM(NSUInteger, PayType) {
Alipay = 1,//支付宝支付
WXPay,//微信支付
OtherPay
};
typedef void(^PayBlock)(BOOL success,NSString * _Nonnull msg);
NS_ASSUME_NONNULL_BEGIN
@interface PayManagger : NSObject <WXApiDelegate>
+ (instancetype)shareManage;
/**
拉起支付
@param orderString 拉起支付所用数据
@param type 支付方式
@param resBlock 支付回调
*/
- (void)pushPaymentWithOrdersign:(id)orderString WithType:(PayType)type Block:(PayBlock)resBlock;
/// 支付宝回调处理
/// @param resultDic 响应结果
- (void)alipayResp:(NSDictionary *)resultDic;
@end
NS_ASSUME_NONNULL_END
- PayManagger.m
//
// PayManagger.m
// JY
//
// Created by 王杰 on 2020/02/21.
// Copyright © 2020 飞鱼旅行. All rights reserved.
//
#import "PayManagger.h"
@interface PayManagger ()
@property (nonatomic ,copy)PayBlock block;
@end
@implementation PayManagger
/***
* 单例设计
*/
static PayManagger *_manager = nil;
+(instancetype)shareManage{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (_manager == nil) {
_manager = [[PayManagger alloc] init];
}
});
return _manager;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (_manager == nil) {
_manager = [super allocWithZone:zone];
}
});
return _manager;
}
-(id)copy{
return _manager;
}
-(id)mutableCopy{
return _manager;
}
/**
拉起支付
@param orderString 拉起支付所用数据
@param type 支付方式
@param resBlock 支付回调
*/
- (void)pushPaymentWithOrdersign:(id)orderString WithType:(PayType)type Block:(nonnull PayBlock)resBlock{
if (type == Alipay) { //支付宝
NSString *orderStr = orderString;
if (StringIsNullOrEmpty(orderStr)) {
resBlock(NO,@"订单数据异常");
return;
}
LMJWeakSelf(self);
if (@available(iOS 13.0,*)) {
[[AlipaySDK defaultService] payOrder:orderStr dynamicLaunch:YES fromScheme:@"aliPayForTaiyue" callback:^(NSDictionary *resultDic) {
[weakself alipayResp:resultDic];
}];
}
else{
[[AlipaySDK defaultService] payOrder:orderStr fromScheme:@"aliPayForTaiyue" callback:^(NSDictionary *resultDic) {
[weakself alipayResp:resultDic];
}];
}
}
else if (type == WXPay){
PayReq *req = [[PayReq alloc] init];
req = [PayReq mj_setKeyValues:orderString];
//注:以下数据为假数据,实际使用请换上自己的数据
// req.openID = @""; //APPID
// req.partnerId = @"";//商户号
// req.prepayId = @"wx20095458581091526e83463d33545855302";//预支付交易会话ID
// req.nonceStr = @"pvtLXJB9vKOB32MHvwBmQOnv0czr4upk";//随机字符串
// req.package = @"Sign=WXPay";//扩展字段
// req.timeStamp = 1545271179;//时间戳
// req.sign = @"A37DE7C64DA8C4CEB9E2EC2B6A38B56689EB9B43C2CF1CB7C81E64288990FF1F";//签名
[WXApi sendReq:req completion:^(BOOL success) {
if (!success) {
resBlock(NO,@"没有安装维修");
}
}];
}
else{
}
self.block = resBlock;
}
//支付宝回调处理
- (void)alipayResp:(NSDictionary *)resultDic{
NSString *resultStatus = resultDic[@"resultStatus"];
switch ([resultStatus integerValue]) {
case 9000: //订单支付成功
{
self.block(YES,@"订单支付成功");
}
break;
case 8000: //正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
{
self.block(NO,@"订单处理中,请稍后查询订单列表");
}
break;
case 4000: //订单支付失败
{
self.block(NO,@"订单支付失败");
}
break;
case 5000: //重复请求
{
self.block(NO,@"请勿重复请求支付");
}
break;
case 6001: //用户中途取消
{
self.block(NO,@"中途取消支付");
}
break;
case 6002: //网络连接出错
{
self.block(NO,@"网络连接出错,请检查网络");
}
break;
case 6004: //支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
{
self.block(NO,@"订单处理中,请稍后查询订单列表");
}
break;
default:{
}
break;
}
}
//微信支付回调
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp*)resp{
if([resp isKindOfClass:[PayResp class]])
{
//支付返回结果,实际支付结果需要去微信服务器端查询
PayResp *response = (PayResp*)resp;
switch (response.errCode) {
case WXSuccess:
{
NSLog(@"微信支付-成功");
self.block(YES,@"订单支付成功");
break;
}
case WXErrCodeUserCancel:
{
NSLog(@"微信支付-用户点击取消");
self.block(NO,@"中途取消支付");
break;
}
default:
self.block(NO,@"订单处理中,订单状态未知");
break;
}
}
}
@end