支付宝是目前国内最大的第三方支付平台之一,开放了丰富的API和SDK来帮助开发者在自己的网页、移动应用以及小程序中快速接入支付宝的支付功能,享受支付宝智能风控、便捷的支付流程以及优惠券等多种支付场景,从而打造更好的用户体验和商业模式。
本文将分别介绍支付宝开放平台中网页支付和移动应用支付两种接入方式,包括相关的API、SDK和代码示例,旨在帮助开发者快速接入支付宝支付总部。
一、网页支付
网页支付是指用户在网页上进行支付宝支付,包括PC端和移动端的网页支付,其核心思想是向支付宝平台发送支付请求以及接收支付结果。下面将具体介绍网页支付的相关操作和功能。
1. 注册开发者账号和应用
首先需要在支付宝开放平台注册开发者账号和创建支付宝应用,开发者可以根据需要选择创建移动应用或网站应用,一个开发者账号最多可以创建100个应用。创建应用时,需要填写应用名称、应用类型、应用信息、回调地址等信息,其中回调地址是指支付完成后支付宝服务器会自动向该地址发送支付结果。
2. 调用支付宝API生成订单并获取支付二维码
在前端页面中,需要调用支付宝的API接口来生成订单数据并获取支付二维码。具体来说,可以采用以下步骤:
1)引入支付宝的JS文件,并初始化支付宝的环境和配置:
```javascript
```
2)调用`ap.tradePay()`方法生成订单并获取支付二维码,其中包括以下参数:
参数名 | 参数类型 | 参数说明
---|---|---
tradeNO | String | 订单号,由后台生成
totalAmount | Number | 订单总金额,单位为元,精确到小数点后两位
subject | String | 订单标题
body | String | 订单描述
returnUrl | String | 支付完成后的返回地址
showUrl | String | 商品展示地址
调用示例:
```javascript
ap.tradePay({
tradeNO:'20180101000000001',//生成的订单号
totalAmount:'88',//订单总金额,单位为元,精确到小数点后两位
subject:'测试订单',//订单标题
body:'这是一份测试订单',//订单描述
returnUrl:'http://www.xxx.com/pay/result.html',//支付完成后的返回地址
showUrl:'http://www.xxx.com',//商品展示地址
}, function(response){
if (response.resultCode == '9000') {
//支付成功,获取支付宝交易号并显示在页面上
var tradeNo = response.tradeNO;
document.getElementById('tradeNo').innerHTML = tradeNo;
} else if (response.resultCode == '6001') {
//支付取消
} else {
//支付失败
}
});
```
3. 处理支付结果
当用户完成支付后,支付宝服务器会将支付结果发送到上述的回调地址中,开发者需要在回调接口中处理支付结果。具体来说,需要获取支付结果并根据结果进行相应的处理。以下是一个示例:
```python
# 引入支付宝SDK
from Alipay import AliPay, webapi
# 初始化支付宝SDK
APPID = 'xxxxx' # 应用APPID
APP_PRIVATE_KEY = 'xxxxx' # 应用私钥
ALIPAY_PUBLIC_KEY = 'xxxxx' # 支付宝公钥
ALIPAY_DEBUG = True # 是否调试模式
alipay = AliPay(
appid=APPID,
app_notify_url='http://www.xxx.com/pay/result.html', # 支付完成后的回调地址
app_private_key_string=APP_PRIVATE_KEY,
ali_public_key_string=ALIPAY_PUBLIC_KEY,
sign_type="RSA2",
debug=ALIPAY_DEBUG,
)
# 获取支付结果
data = request.POST.copy() # 获取POST请求参数
sign = data.pop('sign')[0] # 获取签名
success = alipay.verify(data, sign) # 验证签名
# 处理支付结果
if success:
out_trade_no = data.get('out_trade_no') # 获取订单号
trade_no = data.get('trade_no') # 获取支付宝交易号
total_amount = data.get('total_amount') # 获取订单总金额
# 进行后续处理(如更新订单状态等)
return HttpResponse('success')
else:
return HttpResponse('fail')
```
二、移动应用支付
移动应用支付是指用户在移动应用上进行支付宝支付,采用移动应用封装的方式进行调用,包括Android和iOS两种操作系统。下面将具体介绍移动应用支付的相关操作和功能。
1. 注册开发者账号和应用
前往支付宝开放平台注册开发者账号和创建支付宝应用,选择创建移动应用并填写应用名称、应用类型、应用信息、回调地址等信息。创建应用后,需要获得应用的APPID、RSA私钥和RSA公钥等信息,用于后续在移动应用中调用支付宝接口。
2. 集成支付宝SDK
Android和iOS分别需要集成不同的支付宝SDK,具体包括以下步骤:
(1)Android
在`build.gradle`中引入支付宝SDK:
```
implementation 'com.alipay.sdk:alipay-sdk-java:3.1.0'
```
然后在移动应用中调用`AlipayClient`类和`AlipayTradeAppPayRequest`类来生成订单数据和调起支付宝支付:
```java
public class MainActivity extends AppCompatActivity {
private AlipayClient alipayClient; // 支付宝API客户端
private String privateKey = "xxxxx"; // 应用私钥
private String appId = "xxxxx"; // 应用APPID
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化支付宝客户端
alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", appId, privateKey, "json", "UTF-8", ALIPAY_PUBLIC_KEY, "RSA2");
// 订单数据
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("这是一份测试订单");
model.setSubject("测试订单");
model.setOutTradeNo("20180101000000001");
model.setTimeoutExpress("30m"); // 订单过期时间
model.setTotalAmount("88"); // 订单总金额,单位为元
// 支付请求
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setBizModel(model);
request.setNotifyUrl("http://www.xxx.com/pay/result"); // 回调地址
// 支付宝支付页面
String orderString = "";
try {
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); // 发起支付请求
orderString = response.getBody(); // 获取支付结果
} catch (AlipayApiException e) {
e.printStackTrace();
}
// 显示支付二维码或跳转支付宝支付页面
// ...
}
}
```
(2)iOS
在移动应用中引入支付宝SDK,可以使用CocoaPods进行安装:
```
pod 'AlipaySDK-iOS'
```
然后在移动应用的`AppDelegate.m`文件中添加以下代码初始化支付宝SDK:
```objective-c
#import #define ALIPAY_APPID @"xxxxx" // 应用APPID // 支付宝回调函数 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // 处理支付宝回调 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"支付结果:%@", resultDic); }]; return YES; } // 初始化支付宝SDK - (void)initAlipaySDK { NSString *appScheme = [NSString stringWithFormat:@"alipay%@", ALIPAY_APPID]; // 应用URL Scheme [[AlipaySDK defaultService] setRedirectURL:@"http://www.xxx.com/pay/result"]; // 回调地址 [[AlipaySDK defaultService] setAuthV2WithInfo:nil fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSNumber *resultStatus = resultDic[@"resultStatus"]; if ([resultStatus intValue] == 9000) { // 支付成功 NSString *result = resultDic[@"result"]; NSLog(@"支付结果:%@", result); } else if ([resultStatus intValue] == 6001) { // 支付取消 NSLog(@"支付已取消"); } else { // 支付失败 NSLog(@"支付失败"); } }]; } ``` 3. 调用支付宝接口生成订单并获取支付二维码 移动应用需要向支付宝发送请求生成订单数据,并通过接口获取支付二维码或进行跳转支付宝支付页面。以下是一个示例: (1)Android ```java public class MainActivity extends AppCompatActivity { private AlipayClient alipayClient; // 支付宝API客户端 private String privateKey = "xxxxx"; // 应用私钥 private String appId = "xxxxx"; // 应用APPID @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化支付宝客户端 alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", appId, privateKey, "json", "UTF-8", ALIPAY_PUBLIC_KEY, "RSA2"); // 订单数据 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody("这是一份测试订单"); model.setSubject("测试订单"); model.setOutTradeNo("20180101000000001"); model.setTimeoutExpress("30m"); // 订单过期时间 model.setTotalAmount("88"); // 订单总金额,单位为元 // 支付请求 AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); request.setBizModel(model); request.setNotifyUrl("http://www.xxx.com/pay/result"); // 回调地址 // 支付宝支付页面 String orderString = ""; try { AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); // 发起支付请求 orderString = response.getBody(); // 获取支付结果 } catch (AlipayApiException e) { e.printStackTrace(); } // 显示支付二维码或跳转支付宝支付页面 // ... } } ``` (2)iOS ```objective-c - (IBAction)startPay:(id)sender { // 订单数据 NSString *orderString = [NSString stringWithFormat:@"app_id=%@&biz_content={\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"88\",\"subject\":\"测试订单\",\"body\":\"这是一份测试订单\",\"out_trade_no\":\"20140426001101\"}&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA2×tamp=2017-08-09+16:55:53&version=1.0", ALIPAY_APPID]; NSString *sign = [self signString:orderString]; // RSA2签名 // 调用支付宝接口获取支付二维码 [[AlipaySDK defaultService] payOrder:orderString fromScheme:@"alipay2017081208121212" callback:^(NSDictionary *resultDic) { NSNumber *resultStatus = resultDic[@"resultStatus"]; if ([resultStatus intValue] == 9000) { // 支付成功 NSString *result = resultDic[@"result"]; NSLog(@"支付结果:%@", result); } else if ([resultStatus intValue] == 6001) { // 支付取消 NSLog(@"支付已取消"); } else { // 支付失败 NSLog(@"支付失败"); } }]; } ``` 三、代码示例 以下是一个完整的网站支付的代码示例: ```php require_once './AopSdk.php'; require_once './config.php'; require_once './lib/alipay_submit.class.php'; // 订单数据 $out_trade_no = date('YmdHis').rand(1000, 9999); // 订单号,需自行生成 $subject = '测试订单'; // 订单标题 $body = '这是一份测试订单'; // 订单描述 $total_fee = '0.01'; // 订单总金额,单位为元,精确到小数点后两位 // 创建支付宝接口实例 $alipaySubmit = new AlipaySubmit($alipayConfig); // 构造请求参数 $parameter = array( 'service' => $alipayConfig['service'], //接口名称,固定值 'partner' => $alipayConfig['partner'], //合作者身份ID '_input_charset' => trim(strtolower($alipayConfig['input_charset'])), //字符编码格式 'notify_url' => $alipayConfig['notify_url'], //服务器异步通知页面路径 'return_url' => $alipayConfig['return_url'], //页面跳转同步通知页面路径 'out_trade_no' => $out_trade_no, //商户订单号 'subject' => $subject, //订单名称 'total_fee' => $total_fee, //付款金额 'body' => $body, //订单描述 'payment_type' => '1', //支付类型,固定值1 'seller_id' => $alipayConfig['seller_id'], //卖家支付宝用户号 ); // 生成订单数据并进行签名 $alipaySubmit->alipay_gateway_new = $alipayConfig['gatewayUrl'].$alipayConfig['alipayapi']; //指定接口网关 $alipaySubmit->transport = $alipayConfig['transport']; //指定传输协议 $alipaySubmit->cacert = $alipayConfig['cacert']; //指定支付宝公钥证书路径 $alipaySubmit->sign_type = $alipayConfig['sign_type']; //指定签名算法 $request_data = $alipaySubmit->buildRequestPara($parameter); $sign = $alipaySubmit->buildRequestSign($request_data); // 构造完整的请求URL $request_data['sign'] = $sign; $request_data['sign_type'] = $alipayConfig['sign_type']; $url = $alipaySubmit->buildRequestUrl($request_data); // 跳转到支付宝支付页面进行支付 header('location:'.$url); exit; ?> ``` 参考文献: 1. 支付宝开放平台官方文档: 2. 支付宝SDK下载地址: 3. 支付宝SDK开发指南:
发表评论 取消回复