App接入支付宝

正在寻找直击内心的话……

背景介绍

正在开发一个类大众点评的应用,涉及到支付宝支付。虽说不是第一次做支付,但之前遇到的问题现在还是遇到了。所以想记录一下,不对或不合理的地方大家多多指正,共同进步。

资源

请点击一下连接获取资源:
1.蚂蚁金服开放平台App开发文档【包括支付宝Logo和相关素材】
2.App支付客户端SDK和Demo下载
3.【App支付架构】
这里写图片描述
4.【支付场景描述】
这里写图片描述
5.【退款流程】
这里写图片描述

创建应用

假设你已经登录支付宝开放平台,并与支付宝签约

1.创建应用的入口:
(1)【登陆后的网站首页】-【右上角的管理中心】-【开发者中心】
(2)开发文档-接入指引中有创建应用的链接
入口展示:
这里写图片描述
2.创建步骤:
(1)一般选择自用型,具体区别请看这里

(2)记得将APPID保存在你知道的一个地方,Demo测试要用。另外这里需填写的基础信息之后都是可以修改的。

这里的功能,根据需要跟支付宝签约使用。具体看这里
这里写图片描述
请一定要仔细阅读,点击【查看如何使用】后的内容。
这里写图片描述
【设置应用网关】
这里写图片描述
这里写图片描述
【授权回调地址由后台设置】
【设置应用公钥】
步骤和设置应用网关差不多,都是需要校验身份,然后继续操作。验证身份后,根据该文档操作即可
在此需要说明的是:(1)只需要设置一个应用公钥就可以了,当你将自己的公钥设置完后,支付宝会自动生成一个支付宝公钥与其对应。(2)设置公钥时,根据实际条件选择是否为JAVA,以及1024或2048(当然选择2048加密了)。

Demo运行

(1)我是使用真机测试,当你配置好下图的内容时就可以真机运行了。
这里写图片描述
(2)运行后,你会发现不管你点击首页的哪个按钮都会给你提示:缺少appId或者私钥或缺少pid或者appID或者私钥,你需要这样做:在工程内搜索缺少两个字,找到相应的位置,添加AppID,私钥,pid就好了。
AppID:在开发者中心找到你的应用即可看到AppID;
私钥:在你【设置应用公钥】的时候就会得到一个应用私钥,直接用就好,在Demo中你只用设置rsa2PrivateKey(支付宝建议)。
pid:【账户的管理中心】-【服务市场】
这里写图片描述
(3)我在配置完Pid,AppID,私钥后,依然报错:
* rsa_private read error : private key is NULL*
,后来经网上查找使用这个方式解决了错误:
1)在RSADataSigner.m文件中 搜索代码 [result appendString:@"-----BEGIN PRIVATE KEY-----\n"];将其改成[result appendString:@"-----BEGIN RSA PRIVATE KEY-----\n"];
2)在RSADataSigner.m文件中 搜索代码 [result appendString:@"\n-----END PRIVATE KEY-----"];将其改成[result appendString:@"\n-----END RSA PRIVATE KEY-----"];

实际开发

【集成SDK】:只可以手动集成。
请按照点击这里,认真按步骤操作
【业务逻辑】
用户提交订单后,待商家端确认即可进行支付。待支付的订单都展示在一个列表中。
【实现逻辑】
在待支付列表中点击“去支付按钮”,跳转选择支付方式的页面;
选择好支付方式后,将支付方式传递给后台,后台会返回订单字符串,我们根据订单字符串发起支付请求,唤起支付宝支付。
【代码实现】
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) {

        }];

        // 授权跳转支付宝钱包进行支付,处理支付结果
        [[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) {


        }];

        // 授权跳转支付宝钱包进行支付,处理支付结果
        [[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;
}

ViewController.m中
网络请求成功后,获取到订单字符串后,唤起支付宝支付

 self.hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    self.hud.mode = MBProgressHUDAnimationFade;
    NSString *url = [NSString stringWithFormat:@"%@%@",Main_URL,Build_Url];
    NSDictionary *par = @{@"apitoken":[UserDefaut objectForKey:BYD_APIToken],
                          @"ord_type":self.ord_type,
                          @"ord_id":self.orderID,
                          @"pay_type":self.payStr};
    [PPNetworkHelper POST:url parameters:par success:^(id responseObject) {

        [self.hud removeFromSuperview];
        if ([responseObject[@"code"] isEqual:@0]) {

            [MBProgressHUD showMessage:responseObject[@"message"] ToView:self.view.window];

        }else if([responseObject[@"code"] isEqual:@1]){

            // NOTE: 调用支付结果开始支付
            [[AlipaySDK defaultService] payOrder:responseObject[@"data"][@"order_string"] fromScheme:BYD_ScemeStr callback:^(NSDictionary *resultDic) {


                if ([resultDic[@"resultStatus"] isEqualToString:@"9000"]) {

                    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"支付结果" message:@"您已支付成功,再去逛逛吧!" preferredStyle:(UIAlertControllerStyleAlert)];
                    UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"确定" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {

                        [MBProgressHUD showMessage:@"跳转详情页" ToView:self.view];

                    }];
                    [alert addAction:action1];
                    [self presentViewController:alert animated:YES completion:^{



                    }];

                }else if ([resultDic[@"resultStatus"] isEqualToString:@"8000"]){

                    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"支付结果" message:@"您还未完成支付,请继续支付!" preferredStyle:(UIAlertControllerStyleAlert)];
                    UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"确定" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {

                        self.AlipayBtn.selected = NO;


                    }];
                    [alert addAction:action1];
                    [self presentViewController:alert animated:YES completion:^{

                    }];


                }else{

                    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"支付结果" message:@"很抱歉,您支付失败了!" preferredStyle:(UIAlertControllerStyleAlert)];
                    UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"确定" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {

                        self.AlipayBtn.selected = NO;

                    }];
                    [alert addAction:action1];
                    [self presentViewController:alert animated:YES completion:^{

                    }];


                }

            }];


        }else if([responseObject[@"code"] isEqual:@(-2)]){

            [MBProgressHUD showMessage:responseObject[@"message"] ToView:self.view.window];
        }

    } failure:^(NSError *error) {

        [self.hud removeFromSuperview];
        [MBProgressHUD showMessage:Tip_URL ToView:self.view.window];
    }];

【说明】
1.支付回调结果参数如下,请比对这些参数,来进行个性化提示:
点我带你去看参数
2.这是iOS调用说明,你可能会用到

总结

(1)其实用到第三方的东西,特别是有官方说明文档和Demo的这种,都不是难的,关键在于你需要认真阅读官方文档,按照步骤进行操作。
(2)App接入支付的大量工作都在创建应用时配置环境以及后台了,移动端做的工作并不多。

### 配置应用程序以接入支付宝沙箱环境 #### 1. 注册并入驻支付宝开放平台 为了能够使用支付宝提供的沙箱环境,开发者需要先完成支付宝开放平台的注册入驻流程。这一步骤确保了开发者拥有合法的身份来访问配置沙箱资源[^1]。 #### 2. 创建应用与获取AppID 登录到支付宝开放平台后,在平台上创建一个新的应用实例,并记录下分配给该应用唯一的`AppID`。此`AppID`将在后续配置过程中被频繁用到,作为识别不同应用的重要标识符[^4]。 #### 3. 获取必要的API参数 进入沙箱控制台页面,根据提示逐步填写或确认如下信息: - **买家ID** **卖家ID**: 分别代表买方卖方的角色身份; - **网关URL**: 指向用于发起请求的具体地址; - **公私钥对**: 包括但不限于自定义的应用程序RSA私钥、公钥以及从支付宝获得的官方公钥文件;这些密钥对于加密通信至关重要,可以保障数据传输的安全性[^5]。 #### 4. 设置回调通知URL 当交易完成后,服务器会自动触发一次HTTP POST请求回传至预先设定好的服务器端点处(`notify_url`)。因此,需提前规划好相应的处理逻辑服务部署位置,以便及时响应来自支付宝系统的异步消息推送[^2]。 #### 5. 开发者工具支持 利用支付宝提供的开发者工具包(SDK),简化本地开发工作流的同时也提高了编码效率。通过集成SDK内的辅助函数库,可轻松实现诸如签名验证等功能模块,从而减少手动编写复杂业务逻辑的需求。 #### 6. 测试账号准备 在正式开始之前,建议先行建立若干个虚拟用户账户供内部测试用途。这样不仅可以更贴近实际场景来进行全方位的功能检验,而且有助于发现潜在问题所在,进而优化整体解决方案设计。 ```java // Java示例代码片段展示如何初始化AlipayClient对象连接沙箱环境 import com.alipay.api.AlipayApiException; import com.alipay.api.DefaultAlipayClient; public class AlipaySandboxSetup { public static void main(String[] args) throws AlipayApiException { String serverUrl = "https://openapi-sbox.alipay.com"; // 使用沙箱网关 String appId = "your_app_id_here"; String privateKeyPath = "/path/to/private_key.pem"; String alipayPublicKeyPath = "/path/to/alipay_public_key.pem"; DefaultAlipayClient client = new DefaultAlipayClient( serverUrl, appId, loadPrivateKey(privateKeyPath), "json", "UTF-8", loadPublicKey(alipayPublicKeyPath)); System.out.println("Connected to sandbox environment successfully."); } private static String loadPrivateKey(String path){ // 实现读取PEM格式私钥的方法... return ""; } private static String loadPublicKey(String path){ // 实现读取PEM格式公钥的方法... return ""; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值