早年做支付程序
需要与银行做数据对接
后来有了各种支付平台
支付宝、微信、PayPal等等
我们如果想在程序里
做一个付费模块
该怎么接入这些渠道呢
支付宝提供全套开发工具包SDK
只需要按照规范
就能实现支付功能
先要创建应用
访问开发平台
https://openhome.alipay.com/develop/manage
进行应用创建
创建后,就会得到appid,以及秘钥对等信息
后面有几个选择
是进行手机app,手机网站或是电脑网站的开发方式
以手机app为例
APP支付使用原生开发
调用支付宝支付SDK
而手机网站支付是则会在网页里调用支付宝页面
方法略有不同
提供通用SDK和简易版SDK
其中通用版功能齐全
简易版对Java、C#、PHP做了简化
入门者可以从简易版入手
大神可以使用通用版
首先引用maven依赖
以通用版为例
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.38.10.ALL</version>
</dependency>
然后就可以写第一段代码了
首先声明几个常量
可以写在属性或是配置文件中
private String serverUrl="https://openapi.alipaydev.com/gateway.do";
private String appId="202300061726712"; //请换成你自己的
private String privateKey="KQWEJHWRFOc..."; //请换成你自己的
private String alipayPublicKey="KQWEJHWRFOc..."; //请换成你自己的
支付行为,涉及到几个核心类
AlipayClient:创建与支付宝的连接
AlipayTradePagePayRequest:交易请求
AlipayTradePagePayResponse:交易响应
看一个例子:
// 初始化连接
AlipayClient alipayClient = new DefaultAlipayClient(serverUrl,appId,privateKey,"json", "UTF-8",alipayPublicKey,"RSA2");
// 创建请求
AlipayOpenPublicTemplateMessageIndustryModifyRequest request = new AlipayOpenPublicTemplateMessageIndustryModifyRequest();
// 请求订单参数
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "202381726391231");
bizContent.put("total_amount", 100.00);
bizContent.put("subject", "付款");
bizContent.put("product_code", "QUICK_MSECURITY_PAY");
request.setBizContent(bizContent);
// 发出请求,获得响应
AlipayTradePagePayResponse response = alipayClient.execute(request);
if(response.isSuccess()){
// 成功
return response.getBody();
}else{
// 失败
}
以上就是最基本的支付流程
解释一下其中的订单参数
out_trade_no:我方商城的自定义流水号,最大64个字符
total_amount:订单总额,2位小数
subject:订单的标题
product_code:产品码
对于产品码,默认为 QUICK_MSECURITY_PAY
即快捷支付
还有周期支付 CYCLE_PAY_AUTH
例如连续包月就是这种情况
有时我们只是开发一个网页
在支付时需要跳转到支付宝
这就需要用到网站支付接入了
示范代码:
AlipayClient alipayClient = new DefaultAlipayClient(serverUrl,appId,privateKey,"json", "UTF-8",alipayPublicKey,"RSA2");
// 使用特殊的request
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
//异步接收http(s)地址
request.setNotifyUrl("http://www.xiaomian.com/notify");
//同步跳转http(s)地址
request.setReturnUrl("http://www.xiaomian.com/return");
// 请求订单参数
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "202381726391231");
bizContent.put("total_amount", 100.00);
bizContent.put("subject", "商城付款");
bizContent.put("product_code", "QUICK_MSECURITY_PAY");
request.setBizContent(bizContent);
AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);
if(response.isSuccess()){
//成功
} else {
//失败
}
这种情况下进行支付
就会跳转到网页
在支付完成后
会将结果推送给异步地址
http://www.xiaomian.com/notify?total_amount=100.00&buyer_id=2088102116773037&body=矿泉水&trade_no=2023071921001003030200089909&refund_fee=0.00¬ify_time=2023-07-19 14:10:49&subject=矿泉水&sign_type=RSA2&charset=utf-8¬ify_type=trade_status_sync&out_trade_no=07123123122218&gmt_close=2023-07-19 14:10:46&gmt_payment=20123-07-19 14:10:47&trade_status=TRADE_SUCCESS&version=1.0&sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=&gmt_create=2023-07-19 14:10:44&app_id=2023102700040153&seller_id=2088102119685838¬ify_id=4a91b7a78a503640467525113fb7d8bg8e
1.
返回结果去掉sign、sign_type后
需对sign值使用RSA进行解压,验签
验证以下内容:
1.out_trade_no是否我发送的订单号
2.total_amount金额相符
3.seller_id是正确的交易方
4.appid正确
只有全部符合正确
才表示交易是真实的
然后结合trade_status
正确的方式是TRADE_SUCCESS 或 TRADE_FINISHED
TRADE_SUCCESS是支持退款的返回值
TRADE_FINISHED是不支持退款的返回值
今天介绍的支付代码的开发
仅仅是万里长征第一步
付款失败、退款、账单查询、对账
这些一个个功能全部完成
才能称之为一个完善的支付模块
幸好现在有了这么多平台的支撑
让开发也容易了很多
我们迈出的每一步
都是站在前人肩膀之上