今日主題:springboot整合支付寶支付
相信你們在項目開發中可能會碰到須要整合支付寶支付的功能,這個時候,咱們須要知道應該如何整合,我以前寫過一篇普通的支付寶支付的文章,今天來說一下springboot如何整合支付寶支付。html
一、首先咱們須要創建一個springboot工程,支付寶開發助手須要去支付寶開發平臺去下載java
<!-- 支付寶支付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>
二、建立一個配置類spring
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";
}
業務類的實現方式json
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;
}
四、直接訪問控制器的地址,就能夠彈出支付界面api