日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java 支付宝手机网站支付下单 支付回调 及订单查询实现

發(fā)布時(shí)間:2023/12/15 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 支付宝手机网站支付下单 支付回调 及订单查询实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先,參考官方api:
alipay.trade.wap.pay(手機(jī)網(wǎng)站支付接口2.0)
官方提供DEMO下載,不過(guò)是jsp的
準(zhǔn)備工作:平臺(tái)入駐,簽約功能,應(yīng)用上線,配置秘鑰等

使用Alipay SDK:

<!-- 支付寶支付sdk --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.9.124.ALL</version></dependency>

固定參數(shù)配置類:

// 由于部分?jǐn)?shù)據(jù)來(lái)自數(shù)據(jù)庫(kù),這里用到了我自己寫的service,不需要查詢的話也可以直接在config中寫一個(gè)固定值 import com.tb.service.ShopDeviceService;public class AlipayConfig {private ShopDeviceService shopDeviceService;// 為了傳遞service,只能使用new的形式創(chuàng)建public AlipayConfig(ShopDeviceService shopDeviceService) {this.shopDeviceService = shopDeviceService;}// 商戶appidpublic String getAppId() {return shopDeviceService.getDictDetailByNameAndLabel("PAY-INFO", "AlipayAppid");}// 支付寶公鑰public String getAliPayPublicKey() {return shopDeviceService.getDictDetailByNameAndLabel("KEY", "支付寶公鑰");}// 私鑰 pkcs8格式的public String getRSAPrivateKey() {return shopDeviceService.getDictDetailByNameAndLabel("KEY", "支付寶應(yīng)用私鑰");}// 服務(wù)器異步通知頁(yè)面路徑 需http://或者h(yuǎn)ttps://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn)public String getNotifyUrl() {return shopDeviceService.getDictDetailByNameAndLabel("URL", "AliPayNotify");}// 請(qǐng)求網(wǎng)關(guān)地址public String getUrl() {return "https://openapi.alipay.com/gateway.do";}// 編碼public String getCharset() {return "UTF-8";}// 返回格式public String getFormat() {return "json";}// RSA2public String getSignType() {return "RSA2";}public String getProductCode() {return "QUICK_WAP_WAY";}// subjectpublic String getSubject() {return "WASHER";} }

手機(jī)網(wǎng)站支付接口:

// ALIPay 下單 跳轉(zhuǎn)至付款界面@PreAuthorize("@el.check('anonymous')")// 匿名訪問(wèn)@PostMapping("/aliPrePay")public void alipayPlaceOrder(@RequestBody Map params, HttpServletResponse response) throws AlipayApiException {// 創(chuàng)建訂單并返回訂單idShopOrderDTO shopOrderDTO = createOrder(params); //new配置類,傳入需要的serviceAlipayConfig alipayConfig = new AlipayConfig(shopDeviceService);//支付固定寫法從這里開(kāi)始了!AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getUrl(), alipayConfig.getAppId(),alipayConfig.getRSAPrivateKey(), alipayConfig.getFormat(), alipayConfig.getCharset(),alipayConfig.getAliPayPublicKey(), alipayConfig.getSignType());AlipayTradeWapPayRequest req = new AlipayTradeWapPayRequest();AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();model.setOutTradeNo(shopOrderDTO.getId().toString());model.setSubject(alipayConfig.getSubject());String amount = String.valueOf(shopOrderDTO.getAmount().floatValue() / 100);model.setTotalAmount(amount);model.setProductCode(alipayConfig.getProductCode());req.setBizModel(model);req.setNotifyUrl(alipayConfig.getNotifyUrl());logger.info("發(fā)起AliPay下單請(qǐng)求");String form = alipayClient.pageExecute(req).getBody();response.setContentType("text/html;charset=" + alipayConfig.getCharset());try {//直接將完整的表單html輸出到頁(yè)面response.getWriter().write(form);response.getWriter().flush();response.getWriter().close();} catch (IOException e) {logger.info("AliPay 界面跳轉(zhuǎn)失敗");}}

異步通知接口:

// AliPay 支付異步通知@PreAuthorize("@el.check('anonymous')")@PostMapping("/aliPayNotify")public void alipayReturn(HttpServletRequest request) {logger.info("AliPay 支付回調(diào):");Map<String,String> params = new HashMap();Map requestParams = request.getParameterMap();for (Iterator 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] + ",";}//亂碼解決,這段代碼在出現(xiàn)亂碼時(shí)使用。如果mysign和sign不相等也可以使用這段代碼轉(zhuǎn)化 valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");params.put(name, valueStr);}String out_trade_no = request.getParameter("out_trade_no");ShopOrderDTO orderDto = shopOrderService.findById(Long.valueOf(out_trade_no));String trade_no = request.getParameter("trade_no");String trade_status = request.getParameter("trade_status");Float amount = Float.valueOf(request.getParameter("total_amount"));AlipayConfig alipayConfig = new AlipayConfig(shopDeviceService);try {boolean verify_result = AlipaySignature.rsaCheckV1(params, alipayConfig.getAliPayPublicKey(), alipayConfig.getCharset(), alipayConfig.getSignType());if(verify_result) { // 簽名校驗(yàn)if (trade_status.equals("TRADE_SUCCESS") && !StringUtils.isBlank(trade_no) ) {// 支付成功// 一些自己的判斷,比如金額,訂單支付狀態(tài)等等,自行修改if (amount == Float.valueOf(orderDto.getAmount())/100 && orderDto.getState() == 1) {onSuccess(orderDto, trade_no);return "success";} else if (orderDto.getState() == 0) {// 日志保存shopLogService.anonymousCreate(shopLogService.getShopLog(orderDto.getStoreId(), orderDto.getDeviceId(), "訂單支付狀態(tài)有誤","訂單支付狀態(tài)為已支付 : " + orderDto.getId()));} else if (amount != Float.valueOf(orderDto.getAmount())/100){shopLogService.anonymousCreate(shopLogService.getShopLog(orderDto.getStoreId(), orderDto.getDeviceId(), "AliPay支付金額有誤","金額有誤 : " + orderDto.getId()));}} else {shopLogService.anonymousCreate(shopLogService.getShopLog(orderDto.getStoreId(), orderDto.getDeviceId(), "AliPay支付失敗",orderDto.getId()+""));}} else {logger.info("AliPay 簽名校驗(yàn)失敗");}} catch (AlipayApiException e) {logger.info("AliPay 簽名校驗(yàn)失敗");e.printStackTrace();}return "fail";}

訂單查詢接口:

// AliPay 訂單查詢@PreAuthorize("@el.check('anonymous')")@GetMapping("/aliPayQuery")public ResponseEntity AliPayQuery(String id) {ShopOrderDTO orderDTO = shopOrderService.findById(Long.valueOf(id));// 這里可以加一層判斷,如果訂單是已支付且已有支付id直接返回成功就好,不必再調(diào)支付寶查詢接口try {AlipayConfig alipayConfig = new AlipayConfig(shopDeviceService);AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getUrl(), alipayConfig.getAppId(),alipayConfig.getRSAPrivateKey(), alipayConfig.getFormat(), alipayConfig.getCharset(),alipayConfig.getAliPayPublicKey(), alipayConfig.getSignType());AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();AlipayTradeQueryModel model = new AlipayTradeQueryModel();model.setOutTradeNo(id);request.setBizModel(model);logger.info("發(fā)起 AliPay 查詢請(qǐng)求:");AlipayTradeQueryResponse response = alipayClient.execute(request);Map map = JSON.parseObject(response.getBody(), Map.class);Map result = JSON.parseObject(map.get("alipay_trade_query_response").toString(), Map.class);if (result.get("code").toString().equals("10000") && result.get("trade_status").toString().equals("TRADE_SUCCESS") // 支付成功&& Float.valueOf(result.get("total_amount").toString()) == Float.valueOf(orderDTO.getAmount())) { // 金額與訂單金額相等// TODO 支付成功后回調(diào)已經(jīng)做了一些事 查詢的時(shí)候要做什么有待思考ShopOrder order = new ShopOrder();order.setId(orderDTO.getId());order.setState(0);order.setPayId(result.get("trade_no").toString());shopOrderService.update(order);}return new ResponseEntity<>(result, HttpStatus.OK);} catch (AlipayApiException e) {logger.info("AliPay 查詢失敗");return new ResponseEntity(HttpStatus.OK);}}

總結(jié)

以上是生活随笔為你收集整理的Java 支付宝手机网站支付下单 支付回调 及订单查询实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。