如何集成支付宝
现在不少app内都集成了支付宝功能
使用支付宝进行一个完整的支付功能,大致有以下步骤:
- 向支付宝申请, 与支付宝签约,获得商户ID(partner)和账号ID(seller)
- 下载支付宝SDK
- 生成订单信息,进行数字签名
- 调用支付宝客户端,由支付宝客户端跟支付宝安全服务器打交道
- 支付完毕后,支付宝客户端会自动跳回到原来的应用程序
- 在原来的应用程序中显示支付结果给用户看
支付宝数据流程图
官方数据流程图
注:其实就只有1,3,7步是我们的客户端需要处理的,其余的只需要了解流程即可.
- 构造订单数据并签名
商户客户端根据支付宝钱包支付开发包的接口规则,通过程序生成得到签名结果及 要传输给支付宝钱包支付开发包的数据集合。
- 发送请求数据 把构造完成的数据集合传递给支付宝钱包支付开发包。
-
支付宝钱包支付开发包对请求数据进行处理
支付宝钱包支付开发包将请求数据根据业务规则包装后传递给支付宝服务端,服务端得到这些集合后,会先进行安全校验等验证,一系列验证通过后便会处理完成这 次发送过来的数据请求。
-
返回处理的结果数据
对于处理完成的交易,支付宝会以两种方式把数据分别反馈给商户应用和商户服务 器。
- 在手机客户端上,开发包客户端直接把处理的数据结果反馈给商户客户端;
- 支付宝服务器主动发起通知,调用商户在请求时设定好的页面路径(参数 notify_url,如果商户没设定,则不会进行该操作)。
-
对获取的返回结果数据进行处理
商户在客户端同步通知接收模块或服务端异步通知接收模块获取支付宝返回的结 果数据后,可以结合商户自身业务逻辑进行数据处理(如:订单更新、自动充值到 会员账号中等)。
同步通知结果仅用于结果展示,入库数据需以异步通知为准
。 
支付宝集成步骤
我们这里主要讲解集成,签约按照步骤一步步搞就可以了.
支付宝集成
- 下载 SDK&DEMO
- 文件目录
-
使用规则
文档主要描述如何继承接口开发包2.0标准版
文档主要描述相关接口
- 创建项目,把SDK导入项目中
- 搭建基本的演示界面
- 导入
Demo
中的libcrypto.a
,libssl.a
静态库,openssl
,Util
文件夹和Order
,APAuthV2Info
类 -
报错修正
-
如果遇到运行后报错,类似于以下提示信息:
Cannot find interface declaration for 'NSObject', superclass of 'Base64'
那么需要打开报错了的文件,增加头文件。
#import <Foundation/Foundation.h>
-
如果商户要在某个文件中使用支付宝的开发包类库,需增加引用头文件。
#import <AlipaySDK/AlipaySDK.h>
'openssl/asn1.h' file not found
错误点击项目名称,点击
Build Settings
选项卡,在搜索框中,以关键字search
搜索,对Header Search Paths
增加头文件路径:$(SRCROOT)/项目名
称。如果头文件信息已增加,可不必再增加。- 点击项目名称,点击“Build Settings”选项卡,在搜索框中,以关键字
bitcode
,设置为NO
AlipaySDK.h
导入UIKit
框架- 点击项目名称,点击“Build Phases”选项卡,在“Link Binary with Librarles” 选项中,“SystemConfiguration.framework” 系统库文件.
-
-
生成签名订单字符串
//生成订单字符串 NSString *orderSpec = [order description]; //根据私钥创建订单签名 id<DataSigner> signer = CreateRSADataSigner(privateKey); //生成签名字符串 NSString *signedString = [signer signString:orderSpec];
-
设置
Scheme
-
调用支付接口,监听支付结果回调
- block 回调
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"reslut = %@",resultDic); }];
-
支付宝钱包打开的时候回调 在
AppDelegate
中- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { //跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; return YES; }
10.处理支付宝钱包回调,在
AppDelegate
中- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { //跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; return YES; }
- block 回调
-
生成商家公钥私钥(RSA密钥生成与使用)
- 打开终端
- 进入一个合适目录(我这里放到桌面的RSA文件夹下)
- 生成RSA私钥,输入
openssl genrsa -out rsa_private_key.pem 1024
生成rsa_private_key.pem
- 生成RSA公钥,输入
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
命令回车 后,在当前文件夹中生成一个rsa_public_key.pem
文件为原始 的商户公钥(请妥善保存该文件,PHP 开发语言中需要使用该文件),以下为命 令正确执行截图: - 生成PKCS8 编码的私钥, 输入命令
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
并回车,当前界面中会直接显示出生成结果:复制PKCS8编码的私钥
把复制的内容粘 贴进一个新的记事本中,可随意命名,只要知道这个是 PKCS8 格式的私钥即可(请 妥善保存该文件)。
-
公钥与私钥的使用
# 支付宝
其加密过程可分下面:(自己理解的,不喜勿喷)先将客户端私钥加密某一段信息MD,再将团购信息和那段被加密过的信息MD做一个会话加密,成一个会话加密包,再将会话钥匙用支付宝公钥加密,再将加密包和被加密过的会话钥匙传到后台服务器做解密,先将加密过的会话秘钥用支付宝私钥解密成会话秘钥,再用会话秘钥解密加密包,再取出里面的团购信息和验证签名(计算并加密的MD,只用来做一个验证),再用客户端的公钥做一个签名验证,防止以后出现某些问题出现抵赖问题