在前面我們業(yè)務(wù)功能篇98-99中,我們介紹了電商項(xiàng)目中的訂單模塊服務(wù),那么最后就是需要進(jìn)行支付動作,那么我們這里就通過訂閱第三方平臺支付寶的支付調(diào)用接口功能,來進(jìn)一步完成訂單提交后的支付動作,支付寶的接口使用可以登錄官網(wǎng)開發(fā)指南詳情去了解
SDK依賴引入
在我們對應(yīng)需要進(jìn)行支付調(diào)用的訂單服務(wù)中的pom文件加入依賴,其他服務(wù)不涉及的不需要加
<!-- 支付寶SDK -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.31.12.ALL</version>
</dependency>
配置支付寶的配置文件類
- 根據(jù)支付寶的接口使用方式,傳遞對應(yīng)訂單封裝類對象,進(jìn)行支付操作,并且還有同步回調(diào)地址,在支付完成之后自動跳轉(zhuǎn)到我們指定頁面
- ?回調(diào)地址:public static String return_url = "http://order.msb.com/orderPay/returnUrl"; 指定到該接口,該接口會進(jìn)行支付完成后需要的操作,比如修改訂單的狀態(tài)為已完成,發(fā)貨狀態(tài)為待發(fā)貨等等.. 然后return指定的html訂單詳情頁面list.html
/**
* 支付寶的配置文件
*/
//@ConfigurationProperties(prefix = "alipay")
@Component
@Data
public class AlipayTemplate {
// 商戶appid 沙箱賬號: tklalf8880@sandbox.com
public static String APPID = "2021000121601310";
// 私鑰 pkcs8格式的
public static String RSA_PRIVATE_KEY = "xx";
// 服務(wù)器異步通知頁面路徑 需http://或者h(yuǎn)ttps://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問
public static String notify_url = "http://order.msb.com/payed/notify";
// 頁面跳轉(zhuǎn)同步通知頁面路徑 需http://或者h(yuǎn)ttps://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問 商戶可以自定義同步跳轉(zhuǎn)地址
public static String return_url = "http://order.msb.com/orderPay/returnUrl";
// 請求網(wǎng)關(guān)地址
public static String URL = "https://openapi.alipaydev.com/gateway.do";
// 編碼
public static String CHARSET = "UTF-8";
// 返回格式
public static String FORMAT = "json";
// 支付寶公鑰
public static String ALIPAY_PUBLIC_KEY = "xx";
// 日志記錄目錄
public static String log_path = "/log";
// RSA2
public static String SIGNTYPE = "RSA2";
public String pay(PayVo payVo){
// SDK 公共請求類,包含公共請求參數(shù),以及封裝了簽名與驗(yàn)簽,開發(fā)者無需關(guān)注簽名與驗(yàn)簽
//調(diào)用RSA簽名方式
AlipayClient client = new DefaultAlipayClient(URL,
APPID,
RSA_PRIVATE_KEY,
FORMAT,
CHARSET,
ALIPAY_PUBLIC_KEY,
SIGNTYPE);
AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();
// 封裝請求支付信息
AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
model.setOutTradeNo(payVo.getOut_trader_no());
model.setSubject(payVo.getSubject());
model.setTotalAmount(payVo.getTotal_amount());
model.setBody(payVo.getBody());
model.setTimeoutExpress("5000");
model.setProductCode("11111");
alipay_request.setBizModel(model);
// 設(shè)置異步通知地址
alipay_request.setNotifyUrl(notify_url);
// 設(shè)置同步地址
alipay_request.setReturnUrl(return_url);
// form表單生產(chǎn)
String form = "";
try {
// 調(diào)用SDK生成表單
form = client.pageExecute(alipay_request).getBody();
return form;
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
支付接口?
controller層??
payOrder:在訂單頁面中,點(diǎn)擊 支付寶發(fā)起支付請求的方法orderPay:支付完成之后,會同步回調(diào)到訂單詳情的方法,同時(shí)執(zhí)行支付完成后需要的動作,比如修改訂單狀態(tài)為 關(guān)閉, 發(fā)貨狀態(tài)為待發(fā)貨等等..
@Controller
public class OrderWebController {
@Autowired
private OrderService orderService;
@Autowired
AlipayTemplate alipayTemplate;
/**
* 獲取訂單相關(guān)信息
* 然后跳轉(zhuǎn)到支付頁面 tklalf8880@sandbox.com
* @param orderSn
* @return
*/
@GetMapping(value = "/payOrder",produces = "text/html")
@ResponseBody
public String payOrder(@RequestParam("orderSn") String orderSn){
// 根據(jù)訂單編號查詢出相關(guān)的訂單信息,封裝到PayVO中
PayVo payVo = orderService.getOrderPay(orderSn);
String pay = alipayTemplate.pay(payVo);
//System.out.println(pay);
return pay;
}
@GetMapping("/orderPay/returnUrl")
public String orderPay(@RequestParam(value = "orderSn",required = false) String orderSn,
@RequestParam(value = "out_trade_no",required = false) String out_trade_no){
// TODO 完成相關(guān)的支付操作
System.out.println("orderSn = " + orderSn);
if(StringUtils.isNotBlank(orderSn)){
orderService.handleOrderComplete(orderSn);
}else{
//orderService.updateOrderStatus(out_trade_no,OrderConstant.OrderStateEnum.TO_SEND_GOODS.getCode());
orderService.handleOrderComplete(out_trade_no);
}
return "list";
}
service層
@Override
//封裝訂單號對應(yīng)的信息 返回給支付寶配置類的方法
public PayVo getOrderPay(String orderSn) {
// 根據(jù)訂單號查詢相關(guān)的訂單信息
OrderEntity orderEntity = this.getBaseMapper().getOrderByOrderSn(orderSn);
// 通過訂單信息封裝 PayVO對象
PayVo payVo = new PayVo();
payVo.setOut_trader_no(orderSn);
payVo.setTotal_amount(orderEntity.getTotalAmount().setScale(2, RoundingMode.UP).toString());
// 訂單名稱和訂單描述
payVo.setSubject(orderEntity.getOrderSn());
payVo.setBody(orderEntity.getOrderSn());
return payVo;
}
@Override
//支付完成之后,修改訂單狀態(tài)
public void handleOrderComplete(String orderSn) {
// 1.更新訂單狀態(tài)
this.updateOrderStatus(orderSn,OrderConstant.OrderStateEnum.TO_SEND_GOODS.getCode());
// TODO
// 2.更新庫存信息 庫存數(shù)量遞減
// 3.購物車中的已經(jīng)支付的商品移除
// 4.更新會員積分 ....
}
前端核心請求跳轉(zhuǎn)
?
<form action="/orderPay/returnUrl" method="get">
<input type="hidden" name="orderSn" th:value="${orderResponseVO.orderEntity.orderSn}">
<li>
<input type="submit" value="立即支付">
</li>
</form>
<li>
<img src="/static/order/pay/img\zhifubao.png" style="weight:auto;height:30px;" alt="">
<a th:href="'/payOrder?orderSn='+${orderResponseVO.orderEntity.orderSn}">
支付寶
</a>
</li>
支付寶支付完成之后的回調(diào)請求需要放過攔截器,否則會報(bào)錯需要重新登錄的,因?yàn)槭遣煌囊粋€(gè)域名跳轉(zhuǎn),所以之前保存的用戶登錄session會話就不會帶過來,所以需要放過這個(gè)請求接口
new AntPathMatcher().match("/orderPay/**", requestURI)文章來源:http://www.zghlxwxcb.cn/news/detail-707763.html
public class AuthInterceptor implements HandlerInterceptor {
public static ThreadLocal threadLocal = new ThreadLocal();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 支付寶的回調(diào)我們放過
String requestURI = request.getRequestURI();
boolean match = new AntPathMatcher().match("/orderPay/**", requestURI);
if(match){
return true;
}
// 通過HttpSession獲取當(dāng)前登錄的用戶信息
HttpSession session = request.getSession();
Object attribute = session.getAttribute(AuthConstant.AUTH_SESSION_REDIS);
if(attribute != null){
MemberVO memberVO = (MemberVO) attribute;
threadLocal.set(memberVO);
return true;
}
// 如果 attribute == null 說明沒有登錄,那么我們就需要重定向到登錄頁面
session.setAttribute(AuthConstant.AUTH_SESSION_MSG,"請先登錄");
response.sendRedirect("http://auth.msb.com/login.html");
return false;
}
}
?文章來源地址http://www.zghlxwxcb.cn/news/detail-707763.html
到了這里,關(guān)于【業(yè)務(wù)功能篇104】 補(bǔ)充【業(yè)務(wù)功能篇99】微服務(wù)-springcloud-springboot-電商訂單模塊--整合支付的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!