相信大家在项目开发中可能会碰到需要整合支付宝支付的功能,这个时候,我们需要知道应该如何整合,我之前写过一篇普通的支付宝支付的文章,今天来讲一下springboot如何整合支付宝支付。
1、首先我们需要建立一个springboot
工程,支付宝开发助手需要去支付宝开发平台去下载
<!-- 支付宝支付SDK -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.3.49.ALL</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.7</version>
</dependency>
2、创建一个配置类
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://localhost:8080/index.html";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://localhost:8080/payment/alipayReturnNotice";
public static String return_url2 = "http://localhost:8080/payment/alipayReturnNotice2";
// 签名方式
public static String sign_type = "RSA2";
// 字符编码格式
public static String charset = "utf-8";
public final static String FORMAT = "JSON";// 返回格式
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
// 支付宝网关
public static String log_path = "C:\\";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
/**
* 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
* @param sWord 要写入日志里的文本内容
*/
public static void logResult(String sWord) {
FileWriter writer = null;
try {
writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
writer.write(sWord);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.我们需要添加一个控制类
@Autowired
private AlipayService alipayService;
/**
* 直接购买商品逻辑
* @param response
* @param request
*/
@RequestMapping(value = "/pay")
@ResponseBody
public void payMent(String money, HttpServletResponse response, HttpServletRequest request) {
try {
String result=alipayService.aliPay(money,response,request);
} catch (IOException e) {
e.printStackTrace();
} catch (AlipayApiException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 支付宝同步通知页面,成功返回
* @param request
* @param response
* @param httpSession
* @return
* @throws Exception
*/
@RequestMapping(value = "/alipayReturnNotice")
public String alipayReturnNotice(HttpServletRequest request, HttpServletRequest response, HttpSession httpSession) throws Exception {
log.info("支付成功, 进入同步通知接口...");
//获取支付宝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);
}
log.info("支付宝返回参数:"+params);
// 调用SDK验证签名
boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
if(signVerified) {
//商户订单号
String orderNo = 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 total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");
//alipayService.onlyBuy(orderNo);
log.info("******************** 支付成功(支付宝同步通知) ********************");
log.info("* 订单号: {}", orderNo);
log.info("* 支付宝交易号: {}", trade_no);
log.info("* 实付金额: {}", total_amount);
log.info("***************************************************************");
}else{
log.error("同步回调签名验证失败");
}
return "redirect:/index.html";
}
业务类的实现方式
public String aliPay(String money, HttpServletResponse response, HttpServletRequest request) throws Exception {
response.setContentType("text/html;charset=utf-8");
//将数据进行插入到订单表中
//调用支付宝支付
PrintWriter out = response.getWriter();
//获得初始化的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 order_number = new String(System.currentTimeMillis()+"");
//付款金额,从前台获取,必填
String total_amount = new String(money);
//订单名称,必填
String subject = new String("订单");
aliPayRequest.setBizContent("{\"out_trade_no\":\"" + order_number + "\","
+ "\"total_amount\":\"" + total_amount + "\","
+ "\"subject\":\"" + subject + "\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//请求
String result = null;
result = alipayClient.pageExecute(aliPayRequest).getBody();
//输出
out.println(result);
log.info("返回结果={}",result);
return result;
}
4、直接访问控制器的地址,就可以弹出支付界面