1 //測試當面付2.0生成支付二維碼相關代碼:
2 /**
3 當面付二維碼其實只是支付寶接口付款的一個分支,N個分支都在Main中寫着,包括當面支付、查詢訂單、退款、生成二維碼什麼的,每個功能都是一個class類,咱們實際開發的時候,基本上用不了那麼 4 全,這時候咱們就須要把咱們所須要的一部分代碼copy進來,本身修改,本身寫參數,可是咱們複製的有些個別函數,都是在全局事先聲明好的,這時候咱們也要把咱們所能用到事先聲明好的函數copy進來, 5 這樣才能夠繼續進行下去 6
7 好比說當面付二維碼class類的「tradeService」方法,就是是Main中事先聲明好的全局變量,在Main中的靜態代碼塊中聲明的 8
9 /** 必定要在建立AlipayTradeService以前調用Configs.init()設置默認參數 10 * Configs會讀取classpath下的zfbinfo.properties文件配置信息,若是找不到該文件則確認該文件是否在classpath目錄 11 */
12 Configs.init("zfbinfo.properties"); 13
14 /** 使用Configs提供的默認參數 15 * AlipayTradeService可使用單例或者爲靜態成員對象,不須要反覆new 16 */
17 tradeService = new AlipayTradeServiceImpl.ClientBuilder().build(); 18
19 */
20
21 //〓〓〓〓 簡單打印應答方法,在最下面會用到的
22 private void dumpResponse(AlipayResponse response) { 23 if (response != null) { 24 log.info(String.format("code:%s, msg:%s", response.getCode(), response.getMsg())); 25 if (StringUtils.isNotEmpty(response.getSubCode())) { 26 log.info(String.format("subCode:%s, subMsg:%s", response.getSubCode(), 27 response.getSubMsg())); 28 } 29 log.info("body:" + response.getBody()); 30 } 31 } 32
33
34
35 // 測試當面付2.0生成支付二維碼
36 public void test_trade_precreate() { 37 //〓〓〓〓〓在這裏是一個方法,當咱們作項目的時候,要把這個方法加載到一個本身設置的類中,而後如今的日誌應該該成類名.class 38 //〓〓〓〓〓這個去百度查查日誌的建立書寫什麼的就知道了
39 private static final Logger logger = LoggerFactory.getLogger(test_trade_precreate.class); 40
41
42
43 // (必填) 商戶網站訂單系統中惟一訂單號,64個字符之內,只能包含字母、數字、下劃線, 44 // 需保證商戶系統端不能重複,建議經過數據庫sequence生成,
45 String outTradeNo = "tradeprecreate" + System.currentTimeMillis() 46 + (long) (Math.random() * 10000000L); 47 //〓〓〓〓〓order.getOrderNo().toString(); 在前面獲取的訂單號 48
49 // (必填) 訂單標題,粗略描述用戶的支付目的。如「xxx品牌xxx門店當面付掃碼消費」
50 String subject = "xxx品牌xxx門店當面付掃碼消費"; 51 //〓〓〓〓new StringBuilder.append("掃碼支付,訂單號:").append(outTradeNo).toString(); 52
53 // (必填) 訂單總金額,單位爲元,不能超過1億元 54 // 若是同時傳入了【打折金額】,【不可打折金額】,【訂單總金額】三者,則必須知足以下條件:【訂單總金額】=【打折金額】+【不可打折金額】
55 String totalAmount = "0.01"; 56 //〓〓〓〓order.getPayment().toString(); 57 // (可選) 訂單不可打折金額,能夠配合商家平臺配置折扣活動,若是酒水不參與打折,則將對應金額填寫至此字段 58 // 若是該值未傳入,但傳入了【訂單總金額】,【打折金額】,則該值默認爲【訂單總金額】-【打折金額】
59 String undiscountableAmount = "0"; 60
61 // 賣家支付寶帳號ID,用於支持一個簽約帳號下支持打款到不一樣的收款帳號,(打款到sellerId對應的支付寶帳號) 62 // 若是該字段爲空,則默認爲與支付寶簽約的商戶的PID,也就是appid對應的PID
63 String sellerId = ""; 64 //〓〓〓〓無所謂,空着就行。 65 // 訂單描述,能夠對交易或商品進行一個詳細地描述,好比填寫"購買商品2件共15.00元"
66 String body = "購買商品3件共20.00元"; 67 //〓〓〓〓new StringBuilder().append("訂單").append(outTradeNo).append("共賣商品共").append(totalAmount).append("元").toString(); 68 // 商戶操做員編號,添加此參數能夠爲商戶操做員作銷售統計
69 String operatorId = "test_operator_id"; 70
71 // (必填) 商戶門店編號,經過門店號和商家後臺能夠配置精準到門店的折扣信息,詳詢支付寶技術支持
72 String storeId = "test_store_id"; 73
74 // 業務擴展參數,目前可添加由支付寶分配的系統商編號(經過setSysServiceProviderId方法),詳情請諮詢支付寶技術支持
75 ExtendParams extendParams = new ExtendParams(); 76 extendParams.setSysServiceProviderId("2088100200300400500"); 77
78 // 支付超時,定義爲120分鐘
79 String timeoutExpress = "120m"; 80
81 // 商品明細列表,需填寫購買商品詳細信息,
82 List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>(); 83 //〓〓〓〓〓在這裏傳過來一個方法, 用來查找商品訂單表 84 //〓〓〓〓〓 List<OrderItem> orderItemList = orderItemMapper.getByOrderNoUserID(orderNo,userID); 85 //〓〓〓〓〓 for(OrderIter orderItem : orderItemList){ 86 //〓〓〓〓〓這個參數是商品的ID和名字 GoodsDetail goods1 = GoodsDetail.newInstance(orderItem.getProductId().toString(),orderItem.getProductNmame(), 87 //〓〓〓〓〓這個是單價,可是須要乘法運算,這裏有Util工具 BigDecimalUtil.mul(orderItem.getCurrentUnitPrice().doubleValue(),new Double(100).doubleValue()).long(), 88 //〓〓〓〓〓這個是商品的是數量,直接獲取就好 orderItem.getQuantity()); 89 //〓〓〓〓〓 } 90 //〓〓〓〓〓這裏把取到的數據,加到上面支付寶給出的集合裏面就好 orderItemList.add(orderItem); 91 // 建立一個商品信息,參數含義分別爲商品id(使用國標)、名稱、單價(單位爲分)、數量,若是須要添加商品類別,詳見GoodsDetail
92 /**
93 GoodsDetail goods1 = GoodsDetail.newInstance("goods_id001", "xxx小麪包", 1000, 1); 94 // 建立好一個商品後添加至商品明細列表 95 goodsDetailList.add(goods1); 96 〓〓〓〓〓 這裏都是系統給出的例子,在上面咱們已經獲取到商品的數據了,這兩個咱們就直接刪除掉就好 97 // 繼續建立並添加第一條商品信息,用戶購買的產品爲「黑人牙刷」,單價爲5.00元,購買了兩件 98 GoodsDetail goods2 = GoodsDetail.newInstance("goods_id002", "xxx牙刷", 500, 2); 99 goodsDetailList.add(goods2); 100 */
101 // 建立掃碼支付請求builder,設置請求參數
102 AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder() 103 .setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo) 104 .setUndiscountableAmount(undiscountableAmount).setSellerId(sellerId).setBody(body) 105 .setOperatorId(operatorId).setStoreId(storeId).setExtendParams(extendParams) 106 .setTimeoutExpress(timeoutExpress) //這就是回調地址
107 .setNotifyUrl("http://www.test-notify-url.com")//〓〓〓〓〓這個回調地址在沙箱裏面能夠找到,直接複製到這裏面就好 108 // .setNotifyUrl("http://www.test-notify-url.com")//支付寶服務器主動通知商戶服務器裏指定的頁面http路徑,根據須要設置
109 .setGoodsDetailList(goodsDetailList); 110
111 /** 必定要在建立AlipayTradeService以前調用Configs.init()設置默認參數 112 * Configs會讀取classpath下的zfbinfo.properties文件配置信息,若是找不到該文件則確認該文件是否在classpath目錄 113 */
114 //〓〓〓〓〓 Configs.init("zfbinfo.properties"); 115 //這兩句代碼都是在靜態代碼塊中聲明的
116 /** 使用Configs提供的默認參數 117 * AlipayTradeService可使用單例或者爲靜態成員對象,不須要反覆new 118 */
119 //〓〓〓〓〓 AlipayTradeService tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();
120
121
122
123
124
125
126 AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder); 127 switch (result.getTradeStatus()) { 128 case SUCCESS: 129 log.info("支付寶預下單成功: )"); 130 //〓〓〓〓 在這裏,「log」是未聲明的日誌,咱們須要在類上面須要設置一個日誌,詳情請看此類上面。 131 //〓〓〓〓 在上面建立完成日誌以後,咱們就須要吧log改爲咱們建立的:「logger」 就ok了
132 AlipayTradePrecreateResponse response = result.getResponse(); 133
134 //〓〓〓〓這個是打印響應的方法,在Main類中有聲明這個的方法,咱們直接複製下來就好,若是想看的話,就去上面看吧
135 dumpResponse(response); 136
137
138 //〓〓〓〓這裏是下單成功,咱們就要生成二維碼了,把二維碼傳到服務器上面,而後二維碼傳輸給前端,是一個比較關鍵的一點 139 //〓〓〓〓下面咱們建立一個File,判斷是否有文件夾,若是沒有的話,咱們就建立一個文件夾,不然二維碼就不知道該生成到什麼地方了
140 File folder = new File(path); 141 if(!folder.exists()){ 142 folder.serWritable(true); 143 folder.mkdirs(); 144 } 145
146
147
148 // 須要修改成運行機器上的路徑
149 String qrPath = String.format(path+"/qr-%s.png",response.getOutTradeNo()); 150 //〓〓〓〓在這裏咱們就須要建立一個文件名了 後面跟着的那個就是訂單號
151 String qrFileName = String.format("qr-%s.png",response.getOutTradeNo()); 152 //〓〓〓〓在這裏咱們就須要調用支付寶提供的一個方法了,把二維碼生成的路徑寫上面 也有訂單號碼
153 ZxingUtils.getQRCodeImge(response.getQrCode(), 256, qrPath); 154 //〓〓〓〓這裏須要用FTP把二維碼上傳到服務器,若是下面這段代碼在eclipse中寫的話會報異常,咱們把異常拋出一下就好 155 //〓〓〓〓而後把拋出的錯誤打印個日誌,說上傳二維碼異常
156 File targetFile = new File(path,qrFileName); 157 FTPUtil.uploadFile(Lists.newArrayList(targetFile)); 158 //〓〓〓〓下面應該是把FTP的url地址放到map中
159 String qrUrl = PropertiesUtil.getProperty("這裏是url地址,像數據庫密碼那樣的文件")+targetFile.getName(); 160 resuliMap.put("qrUrl",qrUrl); 161 return ServerResponse.creatBySuccess(resuliMap); 162
163
164 log.info("filePath:" + filePath); 165 // ZxingUtils.getQRCodeImge(response.getQrCode(), 256, filePath);
166 break; 167
168 case FAILED: 169 log.error("支付寶預下單失敗!!!"); 170 break; 171
172 case UNKNOWN: 173 log.error("系統異常,預下單狀態未知!!!"); 174 break; 175
176 default: 177 log.error("不支持的交易狀態,交易返回異常!!!"); 178 break; 179 } 180 }
若是你感受本文對你有幫助,歡迎進羣一塊兒探討交流:點我加羣前端