在iOS应用里集成支付宝支付,需要公司和支付宝签约,然后生成相应的密钥。密钥的生成支付宝的开发文档里已经说的非常清楚。
官方的文档和SDK:
https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.zpWFOY&treeId=59&articleId=104352&docType=1
接口名称:AlipaySDK
接口描述:提供支付功能。
Alipay接口主要为商户提供订单支付功能。接口所提供的方法,如下表所示:
方法名称 | 方法描述 |
---|---|
+(Alipay *)defaultService; |
获取服务实例。 |
-(BOOL)isLogined; |
检测本地是否曾登录使用过。 |
-(void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock; |
支付并通过回调返回结果。 |
//【callback处理支付结果】
快捷订单支付iOS
方法名称:pay方法
方法原型:(void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock;
方法功能:提供给商户快捷订单支付功能。
参数名称 | 参数描述 |
---|---|
NSString* scheme | 商户程序注册的URL protocol,供支付完成后回调商户程序使用。 |
(CompletionBlock)completionBlock | 快捷支付开发包回调函数,返回免登、支付结果。本地未安装支付宝客户端,或未成功调用支付宝客户端进行支付的情况下(走H5收银台),会通过该completionBlock返回支付结果。相应的结果参考“同步通知参数说明”。 |
NSString* orderStr | 主要包含商户的订单信息,key=“value”形式,以&连接。 |
支付参数示例如下,参数说明见“请求参数说明”:
1
|
partner=
"2088101568358171"
&seller_id=
"xxx@alipay.com"
&out_trade_no=
"0819145412-6177"
&subject=
"测试"
&body=
"测试测试"
&total_fee=
"0.01"
¬ify_url=
"http://notify.msp.hk/notify.htm"
&service=
"mobile.securitypay.pay"
&payment_type=
"1"
&_input_charset=
"utf-8"
&it_b_pay=
"30m"
&sign=
"lBBK%2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfHXoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2pbjm%2F3kb%2FuGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D"
&sign_type=
"RSA"
|
必须的参数:
参数 | 参数名称 | 类型(字节长度) | 参数说明 | 是否可为空 | 样例 |
---|
service | 接口名称 | String | 接口名称,固定值。 | 不可空 | mobile.securitypay.pay | 接口名称 | String | 接口名称,固定值 |
|
_input_charset | 参数编码字符集 | String | 商户网站使用的编码格式,固定为utf-8。 | 不可空 | utf-8 |
sign_type | 签名方式 | String | 签名类型,目前仅支持RSA。 | 不可空 | RSA |
sign | 签名 | String | 请参见签名。 | 不可空 |
notify_url | 服务器异步通知页面路径 | String(200) | 支付宝服务器主动通知商户网站里指定的页面http路径。 | 不可空 | http://notify.msp.hk/notify.htm |
out_trade_no | 商户网站唯一订单号 | String(64) | 支付宝合作商户网站唯一订单号。 | 不可空 | 0819145412-6177 |
subject | 商品名称 | String(128) | 商品的标题/交易标题/订单标题/订单关键字等。该参数最长为128个汉字。 | 不可空 | 测试 |
payment_type | 支付类型 | String(4) | 支付类型。默认值为:1(商品购买)。 | 不可空 | 1 |
seller_id | 卖家支付宝账号 | String(16) | 卖家支付宝账号(邮箱或手机号码格式)或其对应的支付宝唯一用户号(以2088开头的纯16位数字)。 | 不可空 | xxx@alipay.com |
total_fee | 总金额 | Number | 该笔订单的资金总额,单位为RMB-Yuan。取值范围为[0.01,100000000.00],精确到小数点后两位。 | 不可空 | 0.01 |
body | 商品详情 | String(512) | 对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。 | 不可空 | 测试测试 |
处理客户端返回url
方法名称:处理客户端方法
方法原型:-(void)processOrderWithPaymentResult:(NSURL*)resultUrl standbyCallback:(CompletionBlock)completionBlock;
方法功能:设备已安装支付宝客户端情况下,处理支付宝客户端返回的url。
注意:该方法必须实现,否则将会导致在安装手机支付宝的情况下,支付结果无法正常同步返回。
参数名称 | 参数描述 |
---|---|
NSURL *resultUrl | 支付宝客户端回传的url |
CompletionBlock completionBlock | 本地安装了支付宝客户端,且成功调用支付宝客户端进行支付的情况下,会通过该completionBlock返回支付结果 |
备注:请在APPDelegate的
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
中调用该方法,iOS9.0以上(包括iOS9.0)请在- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
中调用该方法,具体可参见Demo。
回调接口
在支付过程结束后,会通过callbackBlock同步返回支付结果。
返回结果需要通过resultStatus以及result字段的值来综合判断并确定支付结果。在resultStatus=9000,并且success=“true”以及sign=“xxx”校验通过的情况下,证明支付成功。其它情况归为失败。较低安全级别的场合,也可以只通过检查resultStatus以及success=“true”来判定支付结果。以下为订单支付成功的完成信息示例:
1
2
3
4
5
|
{
memo =
""
;
result =
"partner=\"2088101568358171\"&seller_id=\"xxx@alipay.com\"&out_trade_no=\"0819145412-6177\"&subject=\"测试\"&body=\"测试测试\"&total_fee=\"0.01\"¬ify_url=\"http://notify.msp.hk/notify.htm\"&service=\"mobile.securitypay.pay\"&payment_type=\"1\"&_input_charset=\"utf-8\"&it_b_pay=\"30m\"&success=\"true\"&sign_type=\"RSA\"&sign=\"hkFZr+zE9499nuqDNLZEF7W75RFFPsly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE+HCLiBXrPDNdLKCZgSOIqmv46TfPTEqopYfhs+o5fZzXxt34fwdrzN4mX6S13cr3UwmEV4L3Ffir/02RBVtU=\""
;
resultStatus =
"9000"
;
}
|
注意:
支付结果的提取,必须通过CompletionBlock获取,禁止开发者私自解析支付结果返回的URL。获取值的Key对应resultStatus、memo与result(result中的值,开发者可以自行解析);
为了保障已有商户的正常使用,返回参数ResultStatus首字母为大写。在新的SDK中已经用统一的工具类实现了ResultStatus到resultStatus的转换,商户从CompletionBlock中获取resultStatus即可。
其中参数说明:
请求参数说明:
- 商户在请求参数中,自己附属的一些额外参数,不要和支付宝系统中约定的key(下表中)重名,否则将可能导致未知的异常。
比如请求参数格式out_trade_no="1234566"&total_fee="123.5"&rn_check="TRE"
其中out_trade_no、total_fee、rn_check都是支付业务处理关键key,这个里面商户自己将out_trade_no、total_fee认为是支付宝必须传输的参数,rn_check=“TRE”是商户自己的业务数据,但是由于rn_check也是支付宝关键key,支付宝将会认为这个rn_check是支付宝业务的参数,将导致误解析,导致支付出现不可预料的异常。- 支付宝建议,商户不要在请求参数中添加除了支付宝指定的关键key外,还有其他的key用&连接。
比如out_trade_no="1234566"&total_fee="123.5"&homepage="http://www.***.com"
,其中homepage是商户自己的业务key,支付宝建议不要在请求参数中附带和支付无关的业务系统自身的key相关数据。- 商户的请求参数中,所有的key(支付宝关键key或者商户自己的key),其对应的value中都不应该出现支付宝关键key,比如out_trade_no、total_fee、seller_id等,否则该类交易将可能被支付宝拦截,禁止支付。
比如如下的请求out_trade_no="1234566"&total_fee="123.5"&homepage="http://www.***.com"&body="这个辣条不错 out_trade_no=123 total_fee=123.5"&memo="备忘seller_id=2088123213"
这个请求里面的body对应的value值中有支付宝关键key“out_trade_no”以及“total_fee”,请求中对于memo字段中含有seller_id,这样的业务请求参数支付宝将会拦截。
参数 参数名称 类型(字节长度) 参数说明 是否可为空 样例 servic