建议参考支付宝开放平台使用
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePrecreateModel;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
public class AlipayFaceToFaceDemo {
// 商户appid
private static final String APP_ID = "your_app_id";
// 私钥
private static final String APP_PRIVATE_KEY = "your_private_key";
// 支付宝公钥
private static final String ALIPAY_PUBLIC_KEY = "alipay_public_key";
// 支付宝网关
private static final String ALIPAY_GATEWAY = "https://openapi.alipay.com/gateway.do";
// 编码格式
private static final String CHARSET = "UTF-8";
// 返回格式
private static final String FORMAT = "json";
// 签名类型
private static final String SIGN_TYPE = "RSA2";
public static void main(String[] args) throws AlipayApiException {
// 实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(ALIPAY_GATEWAY, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
// 创建API对应的request
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
// 设置业务参数
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setOutTradeNo("20240801002"); // 商户订单号,需要确保唯一性
model.setTotalAmount("0.01"); // 订单总金额,单位为元,精确到小数点后两位
model.setSubject("测试订单"); // 订单标题
request.setBizModel(model);
request.setNotifyUrl("http://www.example.com/callback"); // 设置异步通知地址
// 发起API调用并处理响应
AlipayTradePrecreateResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
System.out.println("调用成功");
System.out.println("二维码生成:" + response.getQrCode()); // 获取二维码链接
// 此处可以将 response.getQrCode() 输出的链接生成二维码图片,供用户扫码支付
} else {
System.out.println("调用失败");
System.out.println("失败原因:" + response.getMsg());
}
// 模拟支付成功后的查询
// 实际项目中可以根据业务逻辑定期或实时查询支付状态
// 这里仅作示例,实际项目中应该异步通知接收支付结果或定期查询支付宝服务器获取支付结果
queryPaymentStatus(alipayClient, model.getOutTradeNo());
}
// 查询支付状态
private static void queryPaymentStatus(AlipayClient alipayClient, String outTradeNo) throws AlipayApiException {
// 创建API对应的request
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
// 设置业务参数
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
model.setOutTradeNo(outTradeNo); // 商户订单号
request.setBizModel(model);
// 发起API调用并处理响应
AlipayTradeQueryResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
System.out.println("查询成功");
System.out.println("交易状态:" + response.getTradeStatus());
} else {
System.out.println("查询失败");
System.out.println("失败原因:" + response.getMsg());
}
}
}
注意事项:
- **依赖项:**示例中使用了支付宝官方提供的 Java SDK,需要在项目中引入对应的 SDK 包。
- **参数配置:**示例中的
APP_ID
、APP_PRIVATE_KEY
和ALIPAY_PUBLIC_KEY
需要替换为实际的应用ID、私钥和支付宝公钥。 - **二维码生成:**成功调用支付宝接口后,可以通过
response.getQrCode()
获取支付二维码链接,用于生成实际的二维码图片,供用户扫码支付。 - **支付状态查询:**示例中展示了模拟查询支付状态的方法
queryPaymentStatus
,实际项目中应根据需求定期或实时查询支付状态。
商户订单号的唯一性通常通过以下几种方式来实现:
时间戳 + 随机数: 使用当前时间戳(精确到毫秒或更高精度)作为订单号的一部分,再加上一定长度的随机数,可以确保订单号的唯一性。例如,将当前时间戳转换成字符串,再加上几位随机数。
String timestamp = String.valueOf(System.currentTimeMillis());
String random = String.format("%04d", new Random().nextInt(10000)); // 生成一个四位数的随机数
String orderId = timestamp + random;