环境准备
现在所有的环境都是使用支付宝开发者平台提供的沙箱环境
-
访问https://openhome.alipay.com/platform/appDaily.htm?tab=info 手机扫描登录
填写资料
-
配置支付密匙详细信息
显示如下:
2.1 首先点击 RSA2(SHA256)密钥 设置
2.2 点击公钥
2.3 根据你的电脑系统下载对应的生成器, 本人如下所示
复制应用公钥保存设置
这样会生成支付宝公钥: 请注意支付宝公钥和应用公钥的区别,两者值不相同,用途也不相同
此时我们就可以进行支付宝正式开发了。
3. springBoot 配置
3.1 pom引入jar包
<!-- 支付宝支付 -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.0.0</version>
</dependency>
3.2 添加配置文件 AliPayConfig
// 应用ID
public static String APP_ID = "登录网页上的app_id";
// 应用私钥
public static String MERCHANT_PRIVATE_KEY = "这个就是你软件配置应用公钥上面的应用私钥";
// 应用公钥
public static String ALIPAY_PUBLIC_KEY = "这个就是你软件生成的应用公钥";
// 支付宝公钥
public static String ZFB_PUBLIC_ID ="XXXXXXXXXXXXX"
// 异步通知 【稍后会进行解释】
public static String notify_url = "";
// 支付成功后出现几秒的回调页面
public static String return_url = "XXXXXXXXXXXXX";
// 签名方式
public static String SIGN_TYPE = "RSA2";
// 字符编码格式
public static String CHARSET = "utf-8";
// 支付宝网关 alipaydev 为沙箱网关 这里不用更改
public static String GATEWAYURL = "https://openapi.alipaydev.com/gateway.do";
3.3 接口编写 【此为方法,接口你可以自定义编写】:
/**
* app端订单网页支付
*
* @param outTradeNo 订单编号
* @param totalAmount 订单价格
* @param subject 商品名称
*/
@Override
public String appPagePay(String outTradeNo, Integer totalAmount, String subject) throws Exception {
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
/** 同步通知,支付完成后,支付成功页面*/
alipayRequest.setReturnUrl(AliPayConfig.return_url);
/** 异步通知,支付完成后,需要进行的异步处理*/
alipayRequest.setNotifyUrl(AliPayConfig.notify_url);
/**销售产品码(固定)*/
String productCode = "QUICK_WAP_WAY";
/** 进行赋值 */
AlipayTradeWapPayModel wapPayModel = new AlipayTradeWapPayModel();
wapPayModel.setOutTradeNo(outTradeNo);
wapPayModel.setSubject(subject);
wapPayModel.setTotalAmount(totalAmount.toString());// 支付金额
wapPayModel.setBody("商品名称");
wapPayModel.setTimeoutExpress("2m");
wapPayModel.setProductCode(productCode);
alipayRequest.setBizModel(wapPayModel);
/** 格式转换*/
String result = alipayClients.pageExecute(alipayRequest).getBody().replace('\"', '\'').replace('\n', ' ');
return result;
}
其中:
/** 异步通知,支付完成后,需要进行的异步处理*/
alipayRequest.setNotifyUrl(AliPayConfig.notify_url);
notify_url 意思为当用户支付成功后,支付宝会远程调用你的接口,当然此接口必须是可以外网访问的接口。同时你也要返回给支付宝接口一些数据 否则支付宝会每隔一段时间调用你的接口, 返回的值为七个字符的
所以在上面 AliPayConfig
配置文件中的 notify_url
格式为 http:// 外网 + 端口 +接口
return_url
接入如下所示:
@ApiOperation("异步通知")
@RequestMapping(value = "/order/getNotifyUrlInfo",method = RequestMethod.POST)
public String aliPayNotifyUrlInfo(HttpServletRequest request, HttpServletResponse response){
//调用的Service接口
return orderService.getNotifyUrlInfo(request,response);
}
getNotifyUrlInfo
方法详情:
@Override
public String getNotifyUrlInfo(HttpServletRequest request, HttpServletResponse response) {
logger.info("收到支付宝异步回调 start...");
//接收参数进行校验
Map<String, String> parameters = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
System.out.println(requestParams.toString());
for (Map.Entry<String, String[]> entry : requestParams.entrySet()) {
String key = entry.getKey();
String[] values = entry.getValue();
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
parameters.put(key, valueStr);
}
//appid
String appId = request.getParameter("app_id");
//我们调用appPagePay方法 传入的订单编号
String merchantOrderNo = request.getParameter("out_trade_no");
// 支付宝交易号
String tradeNo = request.getParameter("trade_no");
try {
//交易状态
String payState = request.getParameter("trade_status");
// 用户支付金额
BigDecimal totalAmount = new BigDecimal(request.getParameter("total_amount"));
// 实收金额
BigDecimal receiptAmount = new BigDecimal(request.getParameter("receipt_amount"));
logger.info("交易状态:{},支付金额为:{},实付金额为:{}", payState, totalAmount,receiptAmount);
//验证签名
boolean signVerified = AlipaySignature.rsaCheckV1(parameters, AliPayConfig.ZFB_PUBLIC_ID , "UTF-8", AliPayConfig.SIGN_TYPE);
// 验签 验证商户id 验证支付宝返回状态
if (signVerified && AliPayConfig.APP_ID.equals(appId) && "TRADE_SUCCESS".equals(payState)) {
//你的业务参数 判断成功后给支付宝返回7个字符的success
return "success";
}
} catch (AlipayApiException e) {
logger.error(e.getErrMsg());
throw new RuntimeException("调用支付宝接口发生异常");
}
return "";
}
详细返回参数请参考支付宝开发者平台 https://opendocs.alipay.com/open/203/105286
异步回调接口必须为post
3.4 测试 【将服务部署在外网可访问的服务】
postMan请求支付:
请求appPagePay
方法后如果我们配置的参数【app_id 应用秘钥等无误】那么会返回一个form表单
使用浏览器打开如下所示:
点击继续浏览器付款:
点击支付宝账户登录
其中账号和密码在如下中:
输入账号密码,点击支付,输入密码等常见步骤这里不进行详述
3.5 查看控制台支付宝是否异步回调我们的接口
到此我们支付宝支付接口对接入门成功!