后台实现支付宝支付的主要逻辑
近期花时间梳理了支付宝支付的后台运作方法。依照官方倡导的方法,把核心业务流程安排在服务器端执行,手机应用只需要通过调用服务接口就能实现付款操作。这种做法不仅增强了安全性能,同时也为日后的维护工作以及功能拓展提供了便利条件。
与微信支付的对比
支付宝付款和微信付款在运作方式上存在不同之处。支付宝付款无需确认用户设备上是否安装了支付宝软件。若外部已有支付宝钱包应用,会立刻转向该应用执行付款操作;如果未安装该应用,系统会自动切换到网页版支付模式。这种处理方式减少了微信支付的一个确认环节,从而优化了开发环节的流程。
官方文档的重要性
研发期间,官方指南是具有最高效力的参考依据。应当让程序员认真研读支付宝开放平台提供的官方指南,以便掌握最新的接口准则和保障措施。尤其对于签名方法、回调响应等核心部分,务必依照指南中的说明来开发,以免造成支付不畅或存在安全风险。
与阿里云推送的冲突问题
#import "AppDelegate.h"
#import
// NOTE: iOS9.0以前使用的API接口
- (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: iOS9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options
{
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
//如果还集成了微信支付的SDK,就写在一起
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options
{
//微信

BOOL result = [WXApi handleOpenURL:url delegate:self];
if (!result) {
//支付宝
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
NSLog(@"支付宝客户端支付结果result = %@",resultDic);
[PHTitleAlertView showWithAlerTitle:resultDic[@"memo"]];
/*
9000 订单支付成功
8000 正在处理中
4000 订单支付失败
6001 用户中途取消
6002 网络连接出错
*/
if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {
// 发通知带出支付成功结果
[[NSNotificationCenter defaultCenter] postNotificationName:@"alpayResult" object:resultDic];
} else {
// 发通知带出支付失败结果
[[NSNotificationCenter defaultCenter] postNotificationName:@"alpayResult" object:resultDic];
}
}];
}
}
return YES;
}
当项目合并了阿里云推送功能时,要留意SDK组合可能引发的矛盾状况。建议使用人工加入SDK的途径,而不是自动组合。这样做能更有效地管理相互关联,防止版本不合和运作不正常。实际编码时,曾碰到自动组合造成推送失效的状况,改用手动组合后,难题便得以化解。
具体实现代码流程
取得订单号:手机端把付款清单发给服务器,服务器创建一个独一无二的订单号送给手机端。这个号码在后续付款环节至关重要,务必确保它不会重复而且能够正常使用。
支付按钮被按下时,客户端会再次向后台发送相关数据,后台依据这些数据制作最终的支付内容,其中涉及金额、商品说明等必要信息。
启动付款环节:服务器端将全部必要信息发送给用户端,用户端通过支付宝应用程序接口调用付款界面。这个环节必须妥善处理信息交互和异常应对,保证付款能够顺利开展。
测试注意事项
#pragma mark - 调起支付宝支付页面
/// 自己写的唤起支付的方法
/// @param payOrder 后台获取的orderStr
- (void)SendAliPay:(NSString *)payOrder
{
//:Url_Scheme 为 app 在 info.plist 注册的 scheme。我用的微信的:Url_Scheme 测试没毛病
[[AlipaySDK defaultService] payOrder:payOrder fromScheme:Url_Scheme callback:^(NSDictionary *resultDic) {
if ([resultDic[@"ResultStatus"] isEqualToString:@"9000"]) {
/*
9000 订单支付成功
8000 正在处理中
4000 订单支付失败
6001 用户中途取消
6002 网络连接出错
*/
[SVProgressHUD dismiss];
}else{
//最终支付结果以后台反馈为准
NSString *str = resultDic[@"ResultStatus"];
NSInteger num = str.integerValue;
switch (num) {
case 8000:
[PHTitleAlertView showWithAlerTitle:@"正在处理"];
break;
case 4000:
[PHTitleAlertView showWithAlerTitle:@"订单支付失败"];
break;
case 6001:
[PHTitleAlertView showWithAlerTitle:@"用户中途取消"];
break;
case 6002:
[PHTitleAlertView showWithAlerTitle:@"网络连接出错"];
break;
default:
break;
}
}
}];
}
测试环节务必留意两种支付情形,一种是用户设备已安装支付宝钱包,另一种是设备未安装时的H5支付情形。建议准备两台测试设备,分别用来模拟这两种情形。同时需留意网络环境的变化,保证在各种网络状态下支付流程都能顺利运作。测试案例应当涵盖正常支付、取消支付、支付未果等所有情形。
版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;
工作时间:8:00-18:00
客服电话
0755-88186625
电子邮件
admin@lanyu.com
扫码二维码
获取最新动态