支付宝和微信支付
首先需要理清楚流程:
用户使用APP客户端,选择商品下单。
商户客户端(就是你做的APP)将用户的商品数据传给商户服务器,请求生成支付订单。
商户后台调用统一下单API向微信的服务器发送请求,微信服务器生成预付单,并生成一个prepay_id返回给商户后台。
商户后台将这个prepay_id返回给商户客户端。
用户点击确认支付,这时候商户客户端调用SDK打开微信客户端,进行微信支付。
微信客户端向微信服务器发起支付请求并返回支付结果(他们之间交互用的就是prepay_id这个参数,微信的服务器要验证微信客户端传过去的参数是否跟第三步中生成的那个id一致)。
用户输入支付密码后,微信客户端提交支付授权,跟微信服务器交互,完成支付
微信服务器给微信客户端发送支付结果提示,并异步给商户服务器发送支付结果通知。
商户客户端通过支付结果回调接口查询支付结果,并向后台检查支付结果是否正确,后台返回支付结果。
商户客户端显示支付结果,完成订单,发货。
虽然看起来有点多,但是理解起来并不复杂,跟我们平时手机上买东西是一样的。我们客户端需要做的就是
调起微信客户端发起支付
显示支付结果
1.支付宝支付
支付文档:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.rIYvCn&treeId=204&articleId=105295&docType=1
1.先导入支付宝SDK
AlipaySDK.bundle
AlipaySDK.framework
在Target —> BuildPhases —> Link Binary With Libraries— 点击+号 -> 搜索你需要的系统库。
78C817C3-3688-456A-9EAB-528D4A92CABA.png
2.服务端直接将组装和签名后的请求串orderString传给客户端
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSInteger resultStatus = [resultDic[@"resultStatus"] integerValue];
if (9000 == resultStatus) {
// [JHNotificationCenter postNotificationName:JH_PaySuceess object:nil];
}else {
// [JHNotificationCenter postNotificationName:JH_Payfailed object:nil];
}
}];
3.配置支付宝客户端返回url处理方法
- (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) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
//这里判断是否发起的请求为微信支付,如果是的话,用WXApi的方法调起微信客户端的支付页面(://pay 之前的那串字符串就是你的APPID,)
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
return YES;
}
}
4.点击项目名称,点击“Info”选项卡,在“URL Types”选项中,点击“+”,在“URL Schemes”中输入“alisdkdemo”。“alisdkdemo”来自于文件“APViewController.m”的NSString *appScheme = @“alisdkdemo”;。
注意:这里的URL Schemes中输入的alisdkdemo,为测试demo,实际商户的app中要填写独立的scheme,建议跟商户的app有一定的标示度,要做到和其他的商户app不重复,否则可能会导致支付宝返回的结果无法正确跳回商户app。
---------------------- 分割线 ----------------------------
微信支付文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
1.先导入微信支付SDK和系统依赖库
导入上面那个iOS头文件和库下载下载出来的SDK包的就行啦,我这里的是SDK1.6.2. 然后需要链接上依赖库,在Target —> BuildPhases —> Link Binary With Libraries— 点击+号 -> 搜索你需要的系统库。
SystemConfiguration.framework
libz.tbd
libsqlite3.0.tbd
CoreTelephony.framework
QuartzCore.framework
2.设置URL Scheme
在注册微信平台APP的时候,会给一个唯一识别标识符(APPID),在APP端开发步骤里面说得很清楚了,需要填在URL Schemes这个地方,
1377427-beca5fe0ce08d030.png.jpeg
3.在你的工程文件中选择Build Setting,在"Other Linker Flags"中加入"-Objc -all_load"
否者会奔溃报错
2016-12-06 09:52:13.897 DynamicSecret[1389:89930] -[__NSArrayM enqueue:]: unrecognized selector sent to instance 0x608000243330
2016-12-06 09:52:13.897 DynamicSecret[1389:89930] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM enqueue:]: unrecognized selector sent to instance 0x608000243330'
4.服务端直接将组装和签名后的请求串返回
#pragma mark ---------------- 微信支付 ------------------
- (void)payWX{
NSDictionary * dict = @{@"appid":@"wx9604159c3556176e",
@"noncestr":@"zyBqE4ZfkaPECcpn",
@"package":@"Sign=WXPay",
@"partnerid":@"1335863001",
@"paySign":@"B2248A0FBBD7288CE698EA47D69EFDA2",
@"prepayid":@"wx201704112020579cae0430420744617273",
@"timestamp":@"1491913257"};
[self weiXinPay:dict];
}
/*开启微信支付*/
- (void)weiXinPay:(NSDictionary *)configPayDic {
[WXApi registerApp:[configPayDic objectForKey:@"appid"]];
//支付信息
PayReq* req = [[PayReq alloc] init];
//商户号
req.partnerId = [configPayDic objectForKey:@"partnerid"];
//预支付ID
req.prepayId = [configPayDic objectForKey:@"prepayid"];
//随机串
req.nonceStr = [configPayDic objectForKey:@"noncestr"];
//时间戳
req.timeStamp = [[configPayDic objectForKey:@"timestamp"] intValue];
//加密串
req.package = [configPayDic objectForKey:@"package"];
//签名
req.sign = [configPayDic objectForKey:@"paySign"];
// 发起微信支付
[WXApi sendReq:req];
}
5.处理微信通过URL启动时传递的数据
//9.0后的方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
//这里判断是否发起的请求为微信支付,如果是的话,用WXApi的方法调起微信客户端的支付页面(://pay 之前的那串字符串就是你的APPID,)
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
return YES;
}
NSString *urlStr = [url absoluteString];
if ([urlStr hasPrefix:WEIXIN_APPID] || [urlStr hasPrefix:WEIXINPAY_APPID]){
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
代理支付回调
//微信SDK自带的方法,处理从微信客户端完成操作后返回程序之后的回调方法,显示支付结果的
-(void) onResp:(BaseResp*)resp
{
//启动微信支付的response
NSString *payResoult = [NSString stringWithFormat:@"errcode:%d", resp.errCode];
if([resp isKindOfClass:[PayResp class]]){
//支付返回结果,实际支付结果需要去微信服务器端查询
switch (resp.errCode) {
case 0:
payResoult = @"支付结果:成功!";
break;
case -1:
payResoult = @"支付结果:失败!";
break;
case -2:
payResoult = @"用户已经退出支付!";
break;
default:
payResoult = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
break;
}
}
NSLog(@"%@",payResoult);
}