支付宝扫码支付功能对接
生活随笔
收集整理的這篇文章主要介紹了
支付宝扫码支付功能对接
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、官方文檔
沙箱環境使用說明:https://docs.open.alipay.com/200/105311。
開放平臺--沙箱環境:https://openhome.alipay.com/platform/appDaily.htm?tab=info。
rsa簽名驗簽工具:https://docs.open.alipay.com/291/106097。
2、沙箱調試環境(買家賬號測試、商家賬號測試)
open_api_domain(支付寶網關):沙箱環境支付寶網關。
mcloud_api_domain使用demo提供默認配置。
pid(商戶uid):沙箱環境商戶uid。
appid(當面付的APPID)?:沙箱環境的APPID。
?private_key:此處請填寫你的商戶私鑰且轉PKCS8格式。
public_key :此處請填寫你的商戶公鑰。
alipay_public_key (SHA256withRsa對應支付寶公鑰)?:沙箱環境復制生成的支付寶公鑰。
?
3、支付寶demo整合到項目中
標紅的兩個java文件
②引入阿里的jar包?
idea里引入第三方jar包?
標紅的jar包直接在pom文件里引入依賴,版本號一定要保持一致?
pom文件里這樣設置可把第三方jar包打到target里面。
<plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><configuration><verbose>true</verbose><overwrite>true</overwrite></configuration></plugin><!-- geelynote maven的核心插件之-complier插件默認只支持編譯Java 1.4,因此需要加上支持高版本jre的配置,在pom.xml里面加上 增加編譯插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.7</source><target>1.7</target><encoding>UTF-8</encoding><compilerArguments><extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs></compilerArguments></configuration></plugin></plugins>?
4、支付寶掃碼和查詢訂單支付狀態
public ServerResponse pay(Long orderNo,Integer userId,String path){Map<String ,String> resultMap = Maps.newHashMap();Order order = orderMapper.selectByUserIdAndOrderNo(userId,orderNo);if(order == null){return ServerResponse.createByErrorMessage("用戶沒有該訂單");}resultMap.put("orderNo",String.valueOf(order.getOrderNo()));// (必填) 商戶網站訂單系統中唯一訂單號,64個字符以內,只能包含字母、數字、下劃線,// 需保證商戶系統端不能重復,建議通過數據庫sequence生成,String outTradeNo = order.getOrderNo().toString();// (必填) 訂單標題,粗略描述用戶的支付目的。如“xxx品牌xxx門店當面付掃碼消費”String subject = new StringBuilder().append("happymmall掃碼支付,訂單號:").append(outTradeNo).toString();// (必填) 訂單總金額,單位為元,不能超過1億元// 如果同時傳入了【打折金額】,【不可打折金額】,【訂單總金額】三者,則必須滿足如下條件:【訂單總金額】=【打折金額】+【不可打折金額】String totalAmount = order.getPayment().toString();// (可選) 訂單不可打折金額,可以配合商家平臺配置折扣活動,如果酒水不參與打折,則將對應金額填寫至此字段// 如果該值未傳入,但傳入了【訂單總金額】,【打折金額】,則該值默認為【訂單總金額】-【打折金額】String undiscountableAmount = "0";// 賣家支付寶賬號ID,用于支持一個簽約賬號下支持打款到不同的收款賬號,(打款到sellerId對應的支付寶賬號)// 如果該字段為空,則默認為與支付寶簽約的商戶的PID,也就是appid對應的PIDString sellerId = "";// 訂單描述,可以對交易或商品進行一個詳細地描述,比如填寫"購買商品2件共15.00元"String body = new StringBuilder().append("訂單").append(outTradeNo).append("購買商品共").append(totalAmount).append("元").toString();// 商戶操作員編號,添加此參數可以為商戶操作員做銷售統計String operatorId = "test_operator_id";// (必填) 商戶門店編號,通過門店號和商家后臺可以配置精準到門店的折扣信息,詳詢支付寶技術支持String storeId = "test_store_id";// 業務擴展參數,目前可添加由支付寶分配的系統商編號(通過setSysServiceProviderId方法),詳情請咨詢支付寶技術支持ExtendParams extendParams = new ExtendParams();extendParams.setSysServiceProviderId("2088100200300400500");// 支付超時,定義為120分鐘String timeoutExpress = "120m";// 商品明細列表,需填寫購買商品詳細信息,List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();List<OrderItem> orderItemList = orderItemMapper.getByOrderNoUserId(orderNo,userId);for(OrderItem orderItem : orderItemList){GoodsDetail goods = GoodsDetail.newInstance(orderItem.getProductId().toString(), orderItem.getProductName(),BigDecimalUtil.mul(orderItem.getCurrentUnitPrice().doubleValue(),new Double(100).doubleValue()).longValue(),orderItem.getQuantity());goodsDetailList.add(goods);}// 創建掃碼支付請求builder,設置請求參數AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder().setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo).setUndiscountableAmount(undiscountableAmount).setSellerId(sellerId).setBody(body).setOperatorId(operatorId).setStoreId(storeId).setExtendParams(extendParams).setTimeoutExpress(timeoutExpress).setNotifyUrl(PropertiesUtil.getProperty("alipay.callback.url"))//支付寶服務器主動通知商戶服務器里指定的頁面http路徑,根據需要設置.setGoodsDetailList(goodsDetailList);AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);switch (result.getTradeStatus()) {case SUCCESS:logger.info("支付寶預下單成功: )");AlipayTradePrecreateResponse response = result.getResponse();dumpResponse(response);File folder = new File(path);if(!folder.exists()){folder.setWritable(true);folder.mkdirs();}// 需要修改為運行機器上的路徑//細節細節細節String qrPath = String.format(path+"/qr-%s.png",response.getOutTradeNo());String qrFileName = String.format("qr-%s.png",response.getOutTradeNo());ZxingUtils.getQRCodeImge(response.getQrCode(), 256, qrPath);File targetFile = new File(path,qrFileName);try {FTPUtil.uploadFile(Lists.newArrayList(targetFile));} catch (IOException e) {logger.error("上傳二維碼異常",e);}logger.info("qrPath:" + qrPath);String qrUrl = PropertiesUtil.getProperty("ftp.server.http.prefix")+targetFile.getName();resultMap.put("qrUrl",qrUrl);return ServerResponse.createBySuccess(resultMap);case FAILED:logger.error("支付寶預下單失敗!!!");return ServerResponse.createByErrorMessage("支付寶預下單失敗!!!");case UNKNOWN:logger.error("系統異常,預下單狀態未知!!!");return ServerResponse.createByErrorMessage("系統異常,預下單狀態未知!!!");default:logger.error("不支持的交易狀態,交易返回異常!!!");return ServerResponse.createByErrorMessage("不支持的交易狀態,交易返回異常!!!");}}// 簡單打印應答private void dumpResponse(AlipayResponse response) {if (response != null) {logger.info(String.format("code:%s, msg:%s", response.getCode(), response.getMsg()));if (StringUtils.isNotEmpty(response.getSubCode())) {logger.info(String.format("subCode:%s, subMsg:%s", response.getSubCode(),response.getSubMsg()));}logger.info("body:" + response.getBody());}}public ServerResponse aliCallback(Map<String,String> params){Long orderNo = Long.parseLong(params.get("out_trade_no"));String tradeNo = params.get("trade_no");String tradeStatus = params.get("trade_status");Order order = orderMapper.selectByOrderNo(orderNo);if(order == null){return ServerResponse.createByErrorMessage("非XXX的訂單,回調忽略");}if(order.getStatus() >= Const.OrderStatusEnum.PAID.getCode()){return ServerResponse.createBySuccess("支付寶重復調用");}if(Const.AlipayCallback.TRADE_STATUS_TRADE_SUCCESS.equals(tradeStatus)){order.setPaymentTime(DateTimeUtil.strToDate(params.get("gmt_payment")));order.setStatus(Const.OrderStatusEnum.PAID.getCode());orderMapper.updateByPrimaryKeySelective(order);}PayInfo payInfo = new PayInfo();payInfo.setUserId(order.getUserId());payInfo.setOrderNo(order.getOrderNo());payInfo.setPayPlatform(Const.PayPlatformEnum.ALIPAY.getCode());payInfo.setPlatformNumber(tradeNo);payInfo.setPlatformStatus(tradeStatus);payInfoMapper.insert(payInfo);return ServerResponse.createBySuccess();}public ServerResponse queryOrderPayStatus(Integer userId,Long orderNo){Order order = orderMapper.selectByUserIdAndOrderNo(userId,orderNo);if(order == null){return ServerResponse.createByErrorMessage("用戶沒有該訂單");}if(order.getStatus() >= Const.OrderStatusEnum.PAID.getCode()){return ServerResponse.createBySuccess();}return ServerResponse.createByError();}?
?
?
總結
以上是生活随笔為你收集整理的支付宝扫码支付功能对接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AES秘钥生成
- 下一篇: 11种常见的时间序列预测方法