1. 加入依赖
-
<!--支付宝-->
-
<dependency>
-
<groupId>com.alipay.sdk
</groupId>
-
<artifactId>alipay-sdk-java
</artifactId>
-
<version>3.3.49.ALL
</version>
-
</dependency>
2. 加入AlipayConfig
使用官方Demo工程中的 AlipayConfig 类。内网穿透地址(内网穿透参考我的另一篇文NATAPP内网穿透服务使用,实现支付接口需要有一个可以外网访问的地址)需要根据当前运行时的实际情况调整。notify_url 和 return_url 需要编写对应的handler方法处理。(如果看到这有点懵,可以看看我的上一篇文沙箱环境使用支付宝,上一篇讲了如何把官方Demo运行起来,包括配置 AlipayConfig 类)
把 AlipayConfig 类复制到工程里面。
-
/* *
-
*类名:AlipayConfig
-
*功能:基础配置类
-
*详细:设置帐户有关信息及返回路径
-
*修改日期:2017-04-05
-
*说明:
-
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
-
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
-
*/
-
-
public
class AlipayConfig {
-
-
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
-
-
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
-
public
static String app_id =
"2016111114435";
-
-
// 商户私钥,您的PKCS8格式RSA2私钥
-
public
static String merchant_private_key =
"MIIEvgIBADANBgkqhkiG9BgQDWR/khpebjBCsiZuHD4yGnD7S+AO1sV/W6MjVrsyXBJ4uLVNf9iemhcGlRpt+Ykh+Zg97iJ6BuJll482ZrtNxIQPRTDs1Lqy+PS5WWA5gOvQkpTKFNkAZWFx0YDiC6SlYXIjsilGC0AVXhFxhN4ayurP5RjYl8j8apAJH84efegwKBgHN2kYlqcHnoMu+ale2KEcEnmxoyVTvUz2HzI67QduuxIHGOst5iq2ytdhJ8t7N93ois6pDJ++Trqascp6srrlPOlPkV9wF1Fy8zJo+qok0+q3BySpYZYqMD42uq0mPWYWLD22MA31X7Ds2u0qXOGRYK5rkHVPvqmjkZ0KbguUsC";
-
-
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
-
public
static String alipay_public_key =
"MIIBIjANBgkqhkiG9w0lYpQpePDsTxIuiU4BQ96bvZ2DGjIM7D3joiJ3Gn+y9RLscFXHZ1dFMD0BtbxHhufd3GAwryasIlx/6rAxWwIdNTi+Rm6++7s0RLcs/JHUlaYvo7NOGSgZoxbNcj3u8G/5RKhBVzkIgcptzai9NwYep7uFNhGI/EZihcN7mNynTrbPdp13QIDAQAB";
-
-
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问,efvya2.natappfree.cc 是我的外网穿透的地址;注意:payNotify 和 payReturn 是下面写的方法接口,一定要对应
-
public
static String notify_url =
"http://efvya2.natappfree.cc/payNotify";
-
-
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
-
public
static String return_url =
"http://efvya2.natappfree.cc/payReturn";
-
-
// 签名方式
-
public
static String sign_type =
"RSA2";
-
-
// 字符编码格式
-
public
static String charset =
"utf-8";
-
-
// 支付宝网关(这是是沙箱环境的网关)
-
public
static String gatewayUrl =
"https://openapi.alipaydev.com/gateway.do";
-
-
}
3. 创建PayController
调下面的“/doPayhtml”就可以成功支付:
-
@Controller
-
public
class PayController {
-
@GetMapping(value=
"/doPay.html")
-
@ResponseBody
-
public String doPay(String WIDout_trade_no, String WIDtotal_amount, String WIDsubject, String WIDbody, HttpServletRequest request) throws Exception {
-
//获得初始化的AlipayClient
-
AlipayClient alipayClient =
new DefaultAlipayClient(
-
AlipayConfig.gatewayUrl,
-
AlipayConfig.app_id,
-
AlipayConfig.merchant_private_key,
"json",
-
AlipayConfig.charset,
-
AlipayConfig.alipay_public_key,
-
AlipayConfig.sign_type);
-
//设置请求参数
-
AlipayTradePagePayRequest alipayRequest =
new AlipayTradePagePayRequest();
-
alipayRequest.setReturnUrl(AlipayConfig.return_url);
-
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
-
//商户订单号,商户网站订单系统中唯一订单号,必填
-
String out_trade_no =
new String(request.getParameter(
"WIDout_trade_no").getBytes(
"ISO-8859-1"),
"UTF-8");
-
//付款金额,必填
-
String total_amount =
new String(request.getParameter(
"WIDtotal_amount").getBytes(
"ISO-8859-1"),
"UTF-8");
-
//订单名称,必填
-
String subject =
new String(request.getParameter(
"WIDsubject").getBytes(
"ISO-8859-1"),
"UTF-8");
-
//商品描述,可空
-
String body =
new String(request.getParameter(
"WIDbody").getBytes(
"ISO-8859-1"),
"UTF-8");
-
alipayRequest.setBizContent(
"{\"out_trade_no\":\""+ out_trade_no +
"\","
-
+
"\"total_amount\":\""+ total_amount +
"\","
-
+
"\"subject\":\""+ subject +
"\","
-
+
"\"body\":\""+ body +
"\","
-
+
"\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
-
//若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明
-
//alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
-
// + "\"total_amount\":\""+ total_amount +"\","
-
// + "\"subject\":\""+ subject +"\","
-
// + "\"body\":\""+ body +"\","
-
// + "\"timeout_express\":\"10m\","
-
// + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
-
//请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节
-
//给支付宝发送请求进行支付操作
-
return alipayClient.pageExecute(alipayRequest).getBody();
-
}
-
-
-
@RequestMapping(
"/payReturn")
-
@ResponseBody
-
public String payReturn(HttpServletRequest request) throws Exception {
-
// 获取支付宝GET过来反馈信息
-
Map<String, String> params =
new HashMap<String, String>();
-
Map<String, String[]> requestParams = request.getParameterMap();
-
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
-
String name = (String) iter.next();
-
String[] values = (String[]) requestParams.get(name);
-
String valueStr =
"";
-
for (
int i =
0; i < values.length; i++) {
-
valueStr = (i == values.length -
1) ? valueStr + values[i] : valueStr + values[i] +
",";
-
}
-
// 乱码解决,这段代码在出现乱码时使用
-
valueStr =
new String(valueStr.getBytes(
"ISO-8859-1"),
"utf-8");
-
params.put(name, valueStr);
-
}
-
boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset,
-
AlipayConfig.sign_type);
// 调用SDK验证签名
-
// ——请在这里编写您的程序(以下代码仅作参考)——
-
if (signVerified) {
-
// 商户订单号
-
String out_trade_no =
new String(request.getParameter(
"out_trade_no").getBytes(
"ISO-8859-1"),
"UTF-8");
-
System.out.println(
"商户订单号---------------------------"+out_trade_no);
-
// 支付宝交易号
-
String trade_no =
new String(request.getParameter(
"trade_no").getBytes(
"ISO-8859-1"),
"UTF-8");
-
// 付款金额
-
String total_amount =
new String(request.getParameter(
"total_amount").getBytes(
"ISO-8859-1"),
"UTF-8");
-
-
-
return
"trade_no:" + trade_no +
"<br/>out_trade_no:" + out_trade_no +
"<br/>total_amount:" + total_amount;
-
-
-
}
else {
-
return
"验签失败";
-
}
-
}
-
-
@RequestMapping(
"/payNotify")
-
@ResponseBody
-
public String payNotify(HttpServletRequest request) throws Exception {
-
// 获取支付宝POST过来反馈信息
-
Map<String, String> params =
new HashMap<String, String>();
-
Map<String, String[]> requestParams = request.getParameterMap();
-
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
-
String name = (String) iter.next();
-
String[] values = (String[]) requestParams.get(name);
-
String valueStr =
"";
-
for (
int i =
0; i < values.length; i++) {
-
valueStr = (i == values.length -
1) ? valueStr + values[i] : valueStr + values[i] +
",";
-
}
-
// 乱码解决,这段代码在出现乱码时使用
-
valueStr =
new String(valueStr.getBytes(
"ISO-8859-1"),
"utf-8");
-
params.put(name, valueStr);
-
}
-
boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset,
-
AlipayConfig.sign_type);
// 调用SDK验证签名
-
// ——请在这里编写您的程序(以下代码仅作参考)——
-
/*
-
* 实际验证过程建议商户务必添加以下校验: 1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
-
* 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), 3、校验通知中的seller_id(或者seller_email)
-
* 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
-
* 4、验证app_id是否为该商户本身。
-
*/
-
if (signVerified) {
// 验证成功
-
// 商户订单号
-
// String out_trade_no = new
-
// String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
-
// 支付宝交易号
-
// String trade_no = new
-
// String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
-
// 交易状态
-
String trade_status =
new String(request.getParameter(
"trade_status").getBytes(
"ISO-8859-1"),
"UTF-8");
-
if (trade_status.equals(
"TRADE_FINISHED")) {
-
// 判断该笔订单是否在商户网站中已经做过处理
-
// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
-
// 如果有做过处理,不执行商户的业务程序
-
// 注意:
-
// 退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
-
}
else
if (trade_status.equals(
"TRADE_SUCCESS")) {
-
// 判断该笔订单是否在商户网站中已经做过处理
-
// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
-
// 如果有做过处理,不执行商户的业务程序
-
// 注意:
-
// 付款完成后,支付宝系统发送该交易状态通知
-
}
-
return
"success";
-
}
else {
// 验证失败
-
return
"fail";
-
// 调试用,写文本函数记录程序运行情况是否正常
-
// String sWord = AlipaySignature.getSignCheckContentV1(params);
-
// AlipayConfig.logResult(sWord);
-
}
-
}
-
}
转载:https://blog.csdn.net/weixin_44210965/article/details/105239894
查看评论