1. 程式人生 > >關於Alipay支付寶介面(Java版)

關於Alipay支付寶介面(Java版)

  1 import java.io.BufferedReader;
  2 import java.io.InputStreamReader;
  3 import java.io.OutputStream;
  4 import java.io.UnsupportedEncodingException;
  5 import java.net.HttpURLConnection;
  6 import java.net.URL;
  7 import java.net.URLEncoder;
  8 import java.util.ArrayList;
  9 import java.util.Collections;
 10 import java.util.HashMap;
 11 import java.util.List;
 12 import java.util.Map;
 13 
 14 
 15 /**
 16  *類名:alipay_service
 17  *功能:支付寶外部服務介面控制
 18  *詳細:該頁面是請求引數核心處理檔案,不需要修改
 19  *版本:3.1
 20  *修改日期:2010-11-24
 21  *說明:
 22   以下程式碼只是為了方便商戶測試而提供的樣例程式碼,商戶可以根據自己網站的需要,按照技術文件編寫,並非一定要使用該程式碼。
 23   該程式碼僅供學習和研究支付寶介面使用,只是提供一個參考。
 24  */
 25 
 26 public class AlipayService {
 27     /**
 28      * 功能:構造表單提交HTML
 29      * @param partner 合作身份者ID
 30      * @param seller_email 簽約支付寶賬號或賣家支付寶帳戶
 31      * @param return_url 付完款後跳轉的頁面 要用 以http開頭格式的完整路徑,不允許加?id=123這類自定義引數
 32      * @param notify_url 交易過程中伺服器通知的頁面 要用 以http開格式的完整路徑,不允許加?id=123這類自定義引數
 33      * @param show_url 網站商品的展示地址,不允許加?id=123這類自定義引數
 34      * @param out_trade_no 請與貴網站訂單系統中的唯一訂單號匹配
 35      * @param subject 訂單名稱,顯示在支付寶收銀臺裡的“商品名稱”裡,顯示在支付寶的交易管理的“商品名稱”的列表裡。
 36      * @param body 訂單描述、訂單詳細、訂單備註,顯示在支付寶收銀臺裡的“商品描述”裡
 37      * @param price 訂單總金額,顯示在支付寶收銀臺裡的“商品單價”裡
 38      * @param logistics_fee 物流費用,即運費。
 39      * @param logistics_type 物流型別,三個值可選:EXPRESS(快遞)、POST(平郵)、EMS(EMS)
 40      * @param logistics_payment 物流支付方式,兩個值可選:SELLER_PAY(賣家承擔運費)、BUYER_PAY(買家承擔運費)
 41      * @param quantity 商品數量,建議預設為1,不改變值,把一次交易看成是一次下訂單而非購買一件商品。
 42      * @param receive_name 收貨人姓名,如:張三
 43      * @param receive_address 收貨人地址,如:XX省XXX市XXX區XXX路XXX小區XXX棟XXX單元XXX號
 44      * @param receive_zip 收貨人郵編,如:123456
 45      * @param receive_phone 收貨人電話號碼,如:0571-81234567
 46      * @param receive_mobile 收貨人手機號碼,如:13312341234
 47      * @param logistics_fee_1 第二組物流費用,即運費。
 48      * @param logistics_type_1 第二組物流型別,三個值可選:EXPRESS(快遞)、POST(平郵)、EMS(EMS)
 49      * @param logistics_payment_1 第二組物流支付方式,兩個值可選:SELLER_PAY(賣家承擔運費)、BUYER_PAY(買家承擔運費)
 50      * @param logistics_fee_2 第三組物流費用,即運費。
 51      * @param logistics_type_2 第三組物流型別,三個值可選:EXPRESS(快遞)、POST(平郵)、EMS(EMS)
 52      * @param logistics_payment_2 第三組物流支付方式,兩個值可選:SELLER_PAY(賣家承擔運費)、BUYER_PAY(買家承擔運費)
 53      * @param buyer_email 預設買家支付寶賬號
 54      * @param discount 折扣,是具體的金額,而不是百分比。若要使用打折,請使用負數,並保證小數點最多兩位數
 55      * @param input_charset 字元編碼格式 目前支援 GBK 或 utf-8
 56      * @param key 安全校驗碼
 57      * @param sign_type 簽名方式 不需修改
 58      * @return 表單提交HTML文字
 59      */
 60     public static String BuildForm(String partner,
 61             String seller_email,
 62             String return_url,
 63             String notify_url,
 64             String show_url,
 65             String out_trade_no,
 66             String subject,
 67             String body,
 68             String price,
 69             String logistics_fee,
 70             String logistics_type,
 71             String logistics_payment,
 72             String quantity,
 73             String receive_name,
 74             String receive_address,
 75             String receive_zip,
 76             String receive_phone,
 77             String receive_mobile,
 78             String logistics_fee_1,
 79             String logistics_type_1,
 80             String logistics_payment_1,
 81             String logistics_fee_2,
 82             String logistics_type_2,
 83             String logistics_payment_2,
 84             String buyer_email,
 85             String discount,
 86             String input_charset,
 87             String key,
 88             String sign_type){
 89         Map sPara = new HashMap();
 90         sPara.put("service","trade_create_by_buyer");
 91         sPara.put("payment_type","1");
 92         sPara.put("partner", partner);
 93         sPara.put("seller_email", seller_email);
 94         sPara.put("return_url", return_url);
 95         sPara.put("notify_url", notify_url);
 96         sPara.put("_input_charset", input_charset);
 97         sPara.put("show_url", show_url);
 98         sPara.put("out_trade_no", out_trade_no);
 99         sPara.put("subject", subject);
100         sPara.put("body", body);
101         sPara.put("price", price);
102         sPara.put("logistics_fee", logistics_fee);
103         sPara.put("logistics_type", logistics_type);
104         sPara.put("logistics_payment", logistics_payment);
105         sPara.put("quantity", quantity);
106         sPara.put("receive_name", receive_name);
107         sPara.put("receive_address", receive_address);
108         sPara.put("receive_zip", receive_zip);
109         sPara.put("receive_phone", receive_phone);
110         sPara.put("receive_mobile", receive_mobile);
111         sPara.put("logistics_fee_1", logistics_fee_1);
112         sPara.put("logistics_type_1", logistics_type_1);
113         sPara.put("logistics_payment_1", logistics_payment_1);
114         sPara.put("logistics_fee_2", logistics_fee_2);
115         sPara.put("logistics_type_2", logistics_type_2);
116         sPara.put("logistics_payment_2", logistics_payment_2);
117         sPara.put("buyer_email", buyer_email);
118         sPara.put("discount", discount);
119         
120         Map sParaNew = AlipayFunction.ParaFilter(sPara); //除去陣列中的空值和簽名引數
121         String mysign = AlipayFunction.BuildMysign(sParaNew, key);//生成簽名結果
122         
123         StringBuffer sbHtml = new StringBuffer();
124         List keys = new ArrayList(sParaNew.keySet());
125         String gateway = "https://www.alipay.com/cooperate/gateway.do?";
126         
127         //GET方式傳遞
128         sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + gateway + "_input_charset=" + input_charset + "\" method=\"get\">");
129         //POST方式傳遞(GET與POST二必選一)
130         //sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + gateway + "_input_charset=" + input_charset + "\" method=\"post\">");
131         
132         for (int i = 0; i < keys.size(); i++) {
133             String name = (String) keys.get(i);
134             String value = (String) sParaNew.get(name);
135             
136             sbHtml.append("<input type=\"hidden\" name=\"" + name + "\" value=\"" + value + "\"/>");
137         }
138         sbHtml.append("<input type=\"hidden\" name=\"sign\" value=\"" + mysign + "\"/>");
139         sbHtml.append("<input type=\"hidden\" name=\"sign_type\" value=\"" + sign_type + "\"/>");
140         
141         //submit按鈕控制元件請不要含有name屬性
142         //sbHtml.append("<input type=\"submit\" value=\"支付寶確認付款\"></form>");
143         
144         sbHtml.append("<script>document.forms['alipaysubmit'].submit();</script>");
145         return sbHtml.toString();
146     }
147     
148     // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 整合Alipay發貨資訊同步 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
149     /** 
150      * 功能:把陣列所有元素按照“引數=引數值”的模式用“&”字元拼接成字串
151      * @param params 需要排序並參與字元拼接的引數組
152      * @param input_charset 編碼格式
153      * @return 拼接後字串
154      */
155     public static String CreateLinkString_urlencode(Map params, String input_charset){
156         List keys = new ArrayList(params.keySet());
157         Collections.sort(keys);
158 
159         String prestr = "";
160 
161         for (int i = 0; i < keys.size(); i++) {
162             String key = (String) keys.get(i);
163             String value = (String) params.get(key);
164 
165             try {
166                 prestr = prestr + key + "=" + URLEncoder.encode(value,input_charset) + "&";
167             } catch (UnsupportedEncodingException e) {
168 
169                 e.printStackTrace();
170             }
171         }
172 
173         return prestr;
174     }
175     
176     /**
177      * 功能:遠端xml解析
178      * @param partner 合作身份者ID
179      * @param trade_no 支付寶交易號。它是登陸支付寶網站在交易管理中查詢得到,一般以8位日期開頭的純數字(如:20100419XXXXXXXXXX)
180      * @param logistics_name 物流公司名稱
181      * @param invoice_no 物流發貨單號
182      * @param transport_type 物流發貨時的運輸型別,三個值可選:POST(平郵)、EXPRESS(快遞)、EMS(EMS)
183      * @param seller_ip 賣家本地電腦IP地址
184      * @param input_charset 字元編碼格式 目前支援 GBK 或 utf-8
185      * @param key 安全校驗碼
186      * @param sign_type 簽名方式 不需修改
187      * @return 獲得解析結果
188      */
189     public static String PostXml(String partner,
190             String trade_no,
191             String logistics_name,
192             String invoice_no,
193             String transport_type,
194             String seller_ip,
195             String input_charset,
196             String key,
197             String sign_type) throws Exception{
198         Map sPara = new HashMap();
199         sPara.put("service","send_goods_confirm_by_platform");
200         sPara.put("partner", partner);
201         sPara.put("trade_no", trade_no);
202         sPara.put("logistics_name", logistics_name);
203         sPara.put("invoice_no", invoice_no);
204         sPara.put("transport_type", transport_type);
205         sPara.put("seller_ip", seller_ip);
206         sPara.put("_input_charset", input_charset);
207         
208         Map sParaNew = AlipayFunction.ParaFilter(sPara); //除去陣列中的空值和簽名引數
209         String mysign = AlipayFunction.BuildMysign(sParaNew, key);//生成簽名結果
210         
211         sParaNew.put("sign", mysign);
212         sParaNew.put("sign_type", "MD5");
213         
214         String strUrl = "https://www.alipay.com/cooperate/gateway.do?_input_charset=utf-8";
215         URL url = new URL(strUrl);
216         HttpURLConnection conn = (HttpURLConnection)url.openConnection();
217         conn.setRequestMethod("POST");
218         conn.setDoInput(true);
219         conn.setDoOutput(true);
220         OutputStream os = conn.getOutputStream();
221         os.write(CreateLinkString_urlencode(sParaNew,input_charset).getBytes("utf-8"));
222         os.close();
223 
224         BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
225         String line;
226         String xmlResult ="";
227         while( (line =br.readLine()) != null ){
228             xmlResult += "\n"+line;
229         }
230         br.close();
231 
232         return xmlResult;
233     }
234 }