支付寶當面付源碼講解


 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     }

 如果你感覺本文對你有幫助,歡迎進群一起探討交流:點我加群


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM