關於Alipay支付寶介面(Java版)
阿新 • • 發佈:2019-01-10
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 }