1、准备工作
支付宝开发api(手机网站支付):https://docs.open.alipay.com/api_1/alipay.trade.wap.pay
1.1、登录蚂蚁金服开放平台
https://open.alipay.com/platform/manageHome.htm
1.2、选择控制台 -》网站&移动应用
1.3创建应用
1.4添加能力
1.5下载签名工具,地址:https://docs.open.alipay.com/291/105971/ ,下载windows,点击:RSA签名验签工具
1.6点击生成秘钥,生成商户私钥和应用秘钥,并且会以文本(txt)的方式保存起来
生成秘钥过程具体看支付宝文档
1.7 拿到APPID 应用公钥私钥支付宝公钥 回到商家中心 绑定APPID 提交审核 审核通过应用处于已上线才能进行测试对接
2、代码开发
2.1 引入java sdk包
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.26.ALL</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
2.2 开发配置类
不使用应用公钥
public class PayConfig {
// 应用ID
public static String APP_ID = "2021003124687304";
// 应用私钥
public static String MERCHANT_PRIVATE_KEY = "MIIEvQIBADA****";
// 应用公钥
public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9***";
// 支付宝公钥
public static String ZFB_PUBLIC_ID = "MIIBIjANBgkqhkiG9*****";
// 异步通知 【稍后会进行解释】
public static String notify_url = "http://**.**.**/api/pay/aliCallback";
// 支付成功后出现几秒的回调页面
public static String return_url = "****";
// 签名方式
public static String SIGN_TYPE = "RSA2";
// 字符编码格式
public static String CHARSET = "utf-8";
//数据类型
public static String format = "json";
//销售产品码,商家和支付宝签约的产品码,默认值为:QUICK_WAP_WAY
public static String productCode = "QUICK_WAP_WAY";
// 支付宝网关 alipaydev 为沙箱网关
public static String GATEWAYURL = "https://openapi.alipay.com/gateway.do";
}
2.3拉起支付代码
/**
* 支付宝支付
*
* @return
*/
private String aliPay(NftOrder nftOrder) throws AlipayApiException {
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(PayConfig.GATEWAYURL, PayConfig.APP_ID,
PayConfig.MERCHANT_PRIVATE_KEY, "json", PayConfig.CHARSET, PayConfig.ZFB_PUBLIC_ID,
PayConfig.SIGN_TYPE);
//该笔订单允许的最晚付款时间
String timeout = "30m";
//设置请求参数
String content = "{\"out_trade_no\":\"" + "系统订单号"+ "\","
+ "\"total_amount\":\"" + "0.01" + "\","
+ "\"subject\":\"" + "商品名称") + "\","
+ "\"timeout_express\":\"" + timeout + "\","
+ "\"body\":\"" + "商品描述" + "\","
+ "\"product_code\":\"" + PayConfig.productCode + "\"}";
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
alipayRequest.setReturnUrl(PayConfig.return_url);
alipayRequest.setNotifyUrl(PayConfig.notify_url);
alipayRequest.setBizContent(content);
//请求
String result = alipayClient.pageExecute(alipayRequest).getBody();
return result;
}
2.4这时候就会在网页让你打开支付宝 进行支付
效果图
2.5支付成功回调接口 接口必须对外开放能在公网访问到 这是阿里云调用你的接口
@ApiOperation(value = "H5支付支付宝回调", notes = "H5支付支付宝回调")
@PostMapping(value = "/aliCallback")
@UnAuthentication
public JsonResult aliCallback(HttpServletRequest request) throws AlipayApiException {
System.out.println("/aliCallback进入支付宝PC异步回调");
Map<String, String> params = new HashMap<String, String>();
//从支付宝回调的request域中取值
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
// 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
System.out.println(request.toString());
System.out.println(params.toString());
//商品订单号
String out_trade_no = request.getParameter("out_trade_no"); // 商户订单号
String trade_no = request.getParameter("trade_no"); // 流水号
System.out.println(out_trade_no);
// 当前交易状态
String tradeStatus = request.getParameter("trade_status"); //交易状态
// 支付金额
String totalAmount = request.getParameter("total_amount"); //交易状态
// 支付时间
String payDate = request.getParameter("gmt_payment"); //交易状态
//3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
boolean signVerified = AlipaySignature.rsaCheckV1(params, PayConfig.ZFB_PUBLIC_ID, PayConfig.CHARSET,
PayConfig.SIGN_TYPE);
if (signVerified) {
System.out.println("验签通过");
//验签通过
if (tradeStatus.equals("TRADE_SUCCESS")) {
//支付成功后的业务处理
System.out.println("TRADE_SUCCESS");
return payService.notifyPcOrder(out_trade_no, trade_no);
}
} else { //验签不通过
System.out.println("验证失败");
return new JsonResult().setSuccess(false).setMsg("验证失败");
}
System.out.println("支付失败");
return new JsonResult().setSuccess(false).setMsg("支付失败");
}
2.6退款接口
3.uniapp支付
uni.request({
url: '后端支付下单接口地址',
method: 'POST',
success: (res)=>{
// 将接口返回的form表单显示到页面
document.querySelector('body').innerHTML = res.data;
// 调用submit方法
document.forms[0].submit()
}
});2