三方支付:微信支付 支付支付 银联支付
对于 还行 一些 配置 看下 官方 文档 :
在 APPDelegate.m 配置
#import <AlipaySDK/AlipaySDK.h>
#import "WechatAuthSDK.h"
#import "WXApiObject.h"
#import "WXApi.h"
#import "WXApiManager.h"
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
NSLog(@"url %@", url);
// url qipeipu://safepay/?%7B%22memo%22:%7B%22memo%22:%22%E7%94%A8%E6%88%B7%E4%B8%AD%E9%80%94%E5%8F%96%E6%B6%88%22,%22ResultStatus%22:%226001%22,%22result%22:%22%22%7D,%22requestType%22:%22safepay%22%7D
// 支付宝支付 增加 的 信息
//如果极简开发包不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给开发包
if ([url.host isEqualToString:@"safepay"]) {
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
//【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
NSLog(@"result = %@",resultDic);
}];
}
if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回authCode
[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
//【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
NSLog(@"result = %@",resultDic);
}];
}
// 银联支付 增加 的信息
[WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
return YES;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 增加 注册微信支付
[WXApi registerApp:WXAPPID withDescription:@"demo 2.0"];
return YES;
}
// 增加 回调 app 的 方法
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
在调用的文件.m中增加
#import "UPPayPlugin.h"
#import <AlipaySDK/AlipaySDK.h>
#import "WXApi.h"
增加 UPPayPluginDelegate
// 支付宝支付
- (void)OrderBtnDidClick
{
[SVProgressHUD showWithStatus:@"正在跳转到支付宝..."];
[SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeClear];
NSString *url = [NSString stringWithFormat:@"%@/bs/ordermain/pay/1", UrlData];
//设置请求体
NSString *orderId = [NSString stringWithFormat:@"%@", OrderIDStr];
NSString *useBalance = [NSString stringWithFormat:@"%i", Flag];
NSString *param=[NSString stringWithFormat:@"orderId=%@&useBalance=%@", orderId, useBalance];
// 请求 后台服务器 支付宝支付的接口 数据
[YCAllHttpTool orderPayWithUrl:url Param:param success:^(YCOrderPay *result){
NSString *appScheme = @"qipeipu";
// 标准来说 传参的 payOrder 也是需要 我们自己 拼接成 支付宝 后台需要的类型 的字符串
// 而 我公司正在后台帮我们做好了 拼接 需要的 类型 的字符串 所以只需要传参 后台服务器
// 返回的 payInfo 的字符串给 支付宝调用方法
// 标准的拼接类型 看官方文档 有拼接类型 看 后面的微信支付也差不多的
//后台返回的格式化的NSString的类型 订单信息
NSString *orderString = result.data.payInfo;
NSLog(@"++++++++++%@&&&&&&&&&&&&&", orderString);
if (orderString) {
[SVProgressHUD showSuccessWithStatus:@"正在打开支付宝支付"];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"%@", resultDic);
self.payResultDict = resultDic;
// self.payResult
self.payResult = [PayResult objectWithKeyValues:resultDic];
self.payResult.channel = 1;
// self.payResultData = [PayResultData objectWithKeyValues:resultDic[@"result"]];
// NSString *str = resultDic[@"result"];
NSDictionary *dict = resultDic[@"result"];
self.Dict = dict;
NSLog(@"%@ , %@", self.payResultData, dict);
// 9000 订单支付成功
// 8000 正在处理中
// 4000 订单支付失败
// 6001 用户中途取消
// 6002 网络连接出错
NSDictionary *dictEvent = @{@"payResult":self.payResult};
if ([self.payResult.resultStatus isEqualToString:@"9000"])
{
NSLog(@"支付完成");
// post2我公司要求将支付信息返回服务器 你需要调用
// [self post2];
// 我增加的 友盟统计 自定义事件 你也不需要调用
[MobClick event:@"alipay_success_event"];
// 下面为 支付成功 跳转到的 支付成功页面的控制器
YCBalancePayController *balanceVc = [YCBalancePayController balance];
[self.navigationController pushViewController:balanceVc animated:NO];
}else if([self.payResult.resultStatus isEqualToString:@"8000"]){
[SVProgressHUD showErrorWithStatus:@"正在处理中"];
// 我调用 友盟统计 自定义事件 你需要调用
[MobClick event:@"alipay_failed_event" attributes:dictEvent];
}else if([self.payResult.resultStatus isEqualToString:@"4000"]){
[SVProgressHUD showErrorWithStatus:@"订单支付失败"];
[MobClick event:@"alipay_failed_event" attributes:dictEvent];
}else if([self.payResult.resultStatus isEqualToString:@"6001"]){
[SVProgressHUD showErrorWithStatus:@"用户中途取消"];
[MobClick event:@"alipay_cancel_event" attributes:dictEvent];
}else{
[SVProgressHUD showErrorWithStatus:@"网络连接出错"];
[MobClick event:@"alipay_failed_event" attributes:dictEvent];
}
}];
}
else{
NSLog(@"支付宝支付失败 没有获得正确的payInfo, %@", result.msg);
NSDictionary *dicEvent = @{@"result":result.msg};
[MobClick event:@"alipay_failed_event" attributes:dicEvent];
NSString *str = [NSString stringWithFormat: @"支付宝支付失败,订单有误或已支付"];
[SVProgressHUD showErrorWithStatus:str];
}
} failure:^(NSError *error){
NSLog(@"支付宝支付失败 %@ ", error);
NSDictionary *dicEvent = @{@"error":error};
[MobClick event:@"alipay_failed_event" attributes:dicEvent];
NSString *str = [NSString stringWithFormat:@"支付宝链接失败,请稍后再试"];
[SVProgressHUD showErrorWithStatus:str];
}];
}
// 银联支付
- (void)OrderCardBtnDidClick
{
[SVProgressHUD showWithStatus:@"正在跳转到银联支付"];
[SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeClear];
NSString *url = [NSString stringWithFormat:@"%@/bs/ordermain/pay/0", UrlData];
//设置请求体
NSString *orderId = [NSString stringWithFormat:@"%@", OrderIDStr];
NSString *useBalance = [NSString stringWithFormat:@"%i", Flag];
NSString *param=[NSString stringWithFormat:@"orderId=%@&useBalance=%@", orderId, useBalance];
// 请求 后台服务器 银联支付的接口 数据
[YCAllHttpTool orderCardPayWithUrl:url Param:param success:^(OrderCardPayInfo *result){
//后台返回的格式化的NSString的类型 订单信息
NSString *orderString = result.data.payInfo;
NSLog(@"orderString=%@",orderString);
if (orderString) {
[SVProgressHUD showSuccessWithStatus:@"正在打开银联支付"];
// 打开银联支付
[UPPayPlugin startPay:orderString mode:@"00" viewController:self delegate:self];
}else
{
NSLog(@"银联支付失败 没有获得正确的payInfo, %@", result.msg);
NSDictionary *dicEvent = @{@"result":result.msg};
[MobClick event:@"cardpay_failed_event" attributes:dicEvent];
NSString *str = [NSString stringWithFormat:@"银联支付失败, 订单号有误或已支付"];
[SVProgressHUD showErrorWithStatus:str];
}
} failure:^(NSError *error){
NSLog(@"银联支付失败--%@", error);
NSDictionary *dicEvent = @{@"error":error};
[MobClick event:@"cardpay_failed_event" attributes:dicEvent];
NSString *str = [NSString stringWithFormat:@"银联链接失败,请稍后再试"];
[SVProgressHUD showErrorWithStatus:str];
}];
}
// 为银联回调方法 UPPayPluginDelegate的方法
-(void)UPPayPluginResult:(NSString *)result
{
NSDictionary *dicEvent = @{@"result":result};
// success、fail、cancel,分别代表:支付成功、支付失败、用户取消支付
if([result isEqualToString:@"cancel"]){
[SVProgressHUD showErrorWithStatus:@"用户取消支付"];
[MobClick event:@"cardpay_cancel_event" attributes:dicEvent];
// return;
}
else if([result isEqualToString:@"success"]){
NSLog(@"银联支付成功result:%@", result);
[MobClick event:@"cardpay_success_event"];
YCBalancePayController *balanceVc = [YCBalancePayController balance];
[self.navigationController pushViewController:balanceVc animated:NO];
}
else //([result isEqualToString:@"fail"])
{
[MobClick event:@"cardpay_failed_event" attributes:dicEvent];
[SVProgressHUD showErrorWithStatus:@"银联支付失败"];
}
}
// 微信支付
// 微信支付的回调 在 WXApiMangager.m中的 onResp: 方法
- (void)WXOrderBtnDidClick
{
[SVProgressHUD showWithStatus:@"正在跳转到微信支付..."];
[SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeClear];
NSString *url = [NSString stringWithFormat:@"%@/bs/ordermain/pay/12", UrlData];
//设置请求体
// NSString *orderId = @"152684";
// NSString *useBalance = @"0";
NSString *orderId = [NSString stringWithFormat:@"%@", OrderIDStr];
NSString *useBalance = [NSString stringWithFormat:@"%i", Flag];
NSString *param=[NSString stringWithFormat:@"orderId=%@&useBalance=%@", orderId, useBalance];
// 请求 后台服务器 微信支付的接口 数据
[YCAllHttpTool wxPayWithUrl:url Param:param success:^(WXPaySDK *result) {
if (![result.state isEqualToString:@"0"]) {
NSMutableDictionary *dicEvent = [NSMutableDictionary dictionary];
if (result.data) {
dicEvent = @{@"result":result.data};
}
[MobClick event:@"wxpay_failed_event" attributes:dicEvent];
NSString *str = [NSString stringWithFormat:@"订单已支付或订单不存在"];
[SVProgressHUD showErrorWithStatus:str];
return;
}
PacketMap *orderString = result.data.packetMap;
// 这就是 PayReq 就是 微信支付 需要的 类型 参数
PayReq *request = [[PayReq alloc] init];
request.partnerId = orderString.partnerid;
request.prepayId= orderString.prepayid;
request.package = orderString.package;
request.nonceStr= orderString.noncestr;
request.timeStamp= orderString.timestamp;
request.sign= orderString.sign;
// 微信支付传递 是 就是 该 PayReq 参数
// 微信支付的回调 在 WXApiMangager.m中的 onResp: 方法
[WXApi sendReq:request];
[SVProgressHUD dismiss];
} failure:^(NSError *error) {
NSLog(@"微信链接失败,请稍后再试 %@ ", error);
NSDictionary *dicEvent = @{@"error":error};
[MobClick event:@"wxpay_failed_event" attributes:dicEvent];
NSString *str = [NSString stringWithFormat:@"微信链接失败,请稍后再试"];
[SVProgressHUD showErrorWithStatus:str];
}];
}
// 微信支付的回调 在 WXApiMangager.m中的 onResp: 方法
// WXApiMangager.m
// 该方法中 我修改了 很多弹框提示 等
// 我修改了 什么 你看官方的 WXApiMangager.m中的 onResp: 比较下 就知道了
- (void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
if (_delegate
&& [_delegate respondsToSelector:@selector(managerDidRecvMessageResponse:)]) {
SendMessageToWXResp *messageResp = (SendMessageToWXResp *)resp;
[_delegate managerDidRecvMessageResponse:messageResp];
}
} else if ([resp isKindOfClass:[SendAuthResp class]]) {
if (_delegate
&& [_delegate respondsToSelector:@selector(managerDidRecvAuthResponse:)]) {
SendAuthResp *authResp = (SendAuthResp *)resp;
[_delegate managerDidRecvAuthResponse:authResp];
}
} else if ([resp isKindOfClass:[AddCardToWXCardPackageResp class]]) {
if (_delegate
&& [_delegate respondsToSelector:@selector(managerDidRecvAddCardResponse:)]) {
AddCardToWXCardPackageResp *addCardResp = (AddCardToWXCardPackageResp *)resp;
[_delegate managerDidRecvAddCardResponse:addCardResp];
}
}else if([resp isKindOfClass:[PayResp class]]){
//支付返回结果,实际支付结果需要去微信服务器端查询
NSString *strMsg,*strTitle = [NSString stringWithFormat:@"支付结果"];
NSMutableDictionary *dicEvent = [NSMutableDictionary dictionary];
if(resp.errStr){
dicEvent = @{@"errMsg":resp.errStr};
}
// NSDictionary *dicEvent = @{@"errMsg":resp.errStr};
// 下面的这种写 字典的话 会发生崩溃现象
// NSDictionary *dicEvent = @{@"errMsg":resp.errStr};
// 当然这样写也是不行的,因为 该字典类型 为 某一类型 不能字符串 类型吧
// NSString *strEvent = resp.errStr;
// NSDictionary *dicEvent = @{@"errMsg":strEvent};
switch (resp.errCode) {
// WXSuccess= 0, /**< 成功 */
// WXErrCodeCommon = -1, /**< 普通错误类型 */
// WXErrCodeUserCancel = -2, /**< 用户点击取消并返回 */
// WXErrCodeSentFail = -3, /**< 发送失败 */
// WXErrCodeAuthDeny = -4, /**< 授权失败 */
// WXErrCodeUnsupport = -5, /**< 微信不支持 */
case WXSuccess:
strMsg = @"微信支付成功!";
NSLog(@"微信支付成功-PaySuccess,retcode = %d", resp.errCode);
// [SVProgressHUD showSuccessWithStatus:strMsg];
[[NSNotificationCenter defaultCenter] postNotificationName:@"backSuccess" object:self];
[MobClick event:@"wxpay_success_event"];
break;
case WXErrCodeUserCancel:
strMsg = @"微信支付被取消";
NSLog(@"微信支付被取消-PayCancel,retcode = %d", resp.errCode);
[SVProgressHUD showErrorWithStatus:strMsg];
[MobClick event:@"wxpay_cancel_event" attributes:dicEvent];
// [[NSNotificationCenter defaultCenter] postNotificationName:@"backSuccess" object:self];
break;
case WXErrCodeCommon:
strMsg = @"微信支付失败,请重新再试";
NSLog(@"微信支付失败-PayCommon,retcode = %d", resp.errCode);
[SVProgressHUD showErrorWithStatus:strMsg];
[MobClick event:@"wxpay_failed_event" attributes:dicEvent];
// [[NSNotificationCenter defaultCenter] postNotificationName:@"backSuccess" object:self];
break;
case WXErrCodeSentFail:
strMsg = @"微信支付发送失败";
NSLog(@"微信支付发送-PaySentFail,retcode = %d", resp.errCode);
[SVProgressHUD showErrorWithStatus:strMsg];
[MobClick event:@"wxpay_failed_event" attributes:dicEvent];
// [[NSNotificationCenter defaultCenter] postNotificationName:@"backSuccess" object:self];
break;
case WXErrCodeAuthDeny:
strMsg = @"微信支付授权失败";
NSLog(@"微信支付授权失败-PayAuthDeny,retcode = %d", resp.errCode);
[SVProgressHUD showErrorWithStatus:strMsg];
[MobClick event:@"wxpay_failed_event" attributes:dicEvent];
// [[NSNotificationCenter defaultCenter] postNotificationName:@"backSuccess" object:self];
break;
case WXErrCodeUnsupport:
strMsg = @"微信支付不支持";
NSLog(@"微信支付不支持-PayUnsupport,retcode = %d", resp.errCode);
[SVProgressHUD showErrorWithStatus:strMsg];
[MobClick event:@"wxpay_failed_event" attributes:dicEvent];
// [[NSNotificationCenter defaultCenter] postNotificationName:@"backSuccess" object:self];
break;
default:
strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
[SVProgressHUD showErrorWithStatus:strMsg];
NSLog(@"微信支付错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
[MobClick event:@"wxpay_failed_event" attributes:dicEvent];
break;
}
// UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
// [alert show];
// [alert release];
}
}