java后台對接支付寶接口,然后生成訂單
package com.alipay.util.httpClient; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.domain.AlipayTradeAppPayModel; import com.alipay.api.domain.AlipayTradeWapPayModel; import com.alipay.api.request.AlipayTradeAppPayRequest; import com.alipay.api.request.AlipayTradeWapPayRequest; import com.alipay.api.response.AlipayTradeAppPayResponse; import com.alipay.api.response.AlipayTradeWapPayResponse; import com.alipay.config.AlipayConfig; import com.alipay.util.AlipaySubmit; import net.sf.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; /** * Created by Administrator on 2016/4/22. */ public class AlipayTools { private static Logger logger = LoggerFactory.getLogger(AlipayTools.class); public static String alipay_wap(String yun_order_no,String subject,String total_fee,String show_url,String body){ //把請求參數打包成數組 Map<String, String> sParaTemp = new HashMap<String, String>(); sParaTemp.put("service", AlipayConfig.service); sParaTemp.put("partner", AlipayConfig.partner); sParaTemp.put("seller_id", AlipayConfig.seller_id); sParaTemp.put("_input_charset", AlipayConfig.input_charset); sParaTemp.put("payment_type", AlipayConfig.payment_type); sParaTemp.put("notify_url", AlipayConfig.notify_url); sParaTemp.put("return_url", AlipayConfig.return_url); sParaTemp.put("out_trade_no", yun_order_no); sParaTemp.put("subject", subject); sParaTemp.put("total_fee", total_fee); sParaTemp.put("show_url", show_url); sParaTemp.put("body", body); //其他業務參數根據在線開發文檔,添加參數.文檔地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.2Z6TSk&treeId=60&articleId=103693&docType=1 //如sParaTemp.put("參數名","參數值"); //建立請求 return AlipaySubmit.buildRequest(sParaTemp, "get", "確認"); } /** * app端,會向我們發送請求,獲取一個加密過后的支付寶訂單字符串 * @param orderId 我們系統的訂單號 * @param subject 標題 * @param total_fee 支付金額 * @param body 訂單說明 * @param notifyUrl 通知地址 * @return Map: status:0 成功 1:失敗 orderString 訂單字符串 */ public static Map alipayCreateOrderAppNew(String orderId,String subject,String total_fee,String body,String notifyUrl) { Map map = new LinkedHashMap(); //產生的訂單字符串 String orderString = ""; //實例化客戶端(參數:網關地址、商戶appid、商戶私鑰、格式、編碼、支付寶公鑰、加密類型) AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig. aliPayUrl, AlipayConfig.appId, AlipayConfig.developerSpoon, "json", AlipayConfig.input_charset, AlipayConfig.aliPaySpoonNew, "RSA2"); //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); //SDK已經封裝掉了公共參數,這里只需要傳入業務參數。 // 以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody(body);//對一筆交易的具體描述信息。如果是多種商品,請將商品描述字符串累加傳給body model.setSubject(subject);//商品的標題/交易標題/訂單標題/訂單關鍵字等 model.setTotalAmount(total_fee);//訂單總金額,單位為元,精確到小數點后兩位,取值范圍[0.01,100000000] //model.setProductCode("QUICK_MSECURITY_PAY");//銷售產品碼,商家和支付寶簽約的產品碼 model.setOutTradeNo(orderId);//商戶網站唯一訂單號,請保證OutTradeNo值每次保證唯一 model.setTimeoutExpress("30m");//該筆訂單允許的最晚付款時間,逾期將關閉交易。取值范圍:1m~15d。m-分鍾,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時創建,都在0點關閉)。 該參數數值不接受小數點, 如 1.5h,可轉換為 90m。 request.setBizModel(model); request.setNotifyUrl(notifyUrl);//商戶外網可以訪問的異步地址 AlipayTradeAppPayResponse response = null; try { response = alipayClient.sdkExecute(request); //調用的是sdkExecute接口 System.out.println(JSONObject.fromObject(response).toString()); } catch (AlipayApiException e) { String massage = "alipay.trade.app.pay接口:訂單簽名錯誤"; System.out.println(massage); } if (response.isSuccess()) { orderString = response.getBody(); System.out.println(orderString); map.put("status", 0);//生成訂單成功 status:0 成功 1:失敗 map.put("orderString", orderString);//訂單串 logger.info("支付寶App支付:支付訂單生成訂單成功out_trade_no----"+orderId); } else { logger.info("支付寶App支付:支付訂單生成失敗out_trade_no----"+orderId); map.put("status",1);//生成訂單成功 status:0 成功 1:失敗 map.put("orderString", "");//訂單串 } return map; } /** * H5支付生成訂單 * @param orderId 我們系統的訂單號 * @param subject 標題 * @param total_fee 支付金額 * @param body 訂單說明 * @param notifyUrl 通知地址 * @return Map: status:0 成功 1:失敗 orderString 訂單From表單 */ public static Map alipayCreateOrderH5(String orderId,String subject,String total_fee,String body,String notifyUrl) { Map map = new LinkedHashMap(); //產生的訂單From表單 String orderString = ""; //實例化客戶端(參數:網關地址、商戶appid、商戶私鑰、格式、編碼、支付寶公鑰、加密類型) AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig. aliPayUrl, AlipayConfig.appId, AlipayConfig.developerSpoon, "json", AlipayConfig.input_charset, AlipayConfig.aliPaySpoonNew, "RSA2"); //當前調用接口名稱:alipay.trade.wap.pay AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); request.setReturnUrl(AlipayConfig.return_url); request.setNotifyUrl(notifyUrl);//商戶外網可以訪問的異步地址 //使用封裝的Model進行傳值 AlipayTradeWapPayModel model = new AlipayTradeWapPayModel(); model.setBody(body);//對一筆交易的具體描述信息。如果是多種商品,請將商品描述字符串累加傳給body model.setSubject(subject);//商品的標題/交易標題/訂單標題/訂單關鍵字等 model.setTotalAmount(total_fee);//訂單總金額,單位為元,精確到小數點后兩位,取值范圍[0.01,100000000] model.setOutTradeNo(orderId);//商戶網站唯一訂單號,請保證OutTradeNo值每次保證唯一 model.setTimeoutExpress("30m");//該筆訂單允許的最晚付款時間,逾期將關閉交易。取值范圍:1m~15d。m-分鍾,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時創建,都在0點關閉)。 該參數數值不接受小數點, 如 1.5h,可轉換為 90m。 //model.setQuitUrl(quitUrl);//用戶付款中途退出返回商戶網站的地址 request.setBizModel(model); AlipayTradeWapPayResponse response = null; try { //調用SDK生成表單 response = alipayClient.pageExecute(request); System.out.println("創建結果:"+JSONObject.fromObject(response).toString()); } catch (AlipayApiException e) { System.out.println("alipay.trade.wap.pay接口:訂單簽名錯誤"); } //判斷是否調用成功 if (response.isSuccess()) { orderString = response.getBody(); System.out.println("==="+orderString); map.put("status", 0);//生成訂單成功 status:0 成功 1:失敗 map.put("orderString", orderString);//訂單From表單 logger.info("支付寶H5支付:支付訂單生成訂單成功out_trade_no----"+orderId); } else { logger.info("支付寶H5支付:支付訂單生成失敗out_trade_no----"+orderId); map.put("status",1);//生成訂單成功 status:0 成功 1:失敗 map.put("orderString", "");// } return map; } }
package com.alipay.config; /* * *類名:AlipayConfig *功能:基礎配置類 *詳細:設置帳戶有關信息及返回路徑 *版本:3.4 *修改日期:2016-03-08 *說明: *以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。 *該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。 */ import com.shopping.app.config.URL; public class AlipayConfig { //↓↓↓↓↓↓↓↓↓↓請在這里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 合作身份者ID,簽約賬號,以2088開頭由16位純數字組成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm public static String partner = "2088021690******"; // 收款支付寶賬號,以2088開頭由16位純數字組成的字符串,一般情況下收款賬號就是簽約賬號 public static String seller_id = partner; // MD5密鑰,安全檢驗碼,由數字和字母組成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm public static String key = "3w4g99buk1zytpbozavxk2bfw9vfpg0i"; // 服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問 public static String notify_url = URL.url + "/appAlipayReturn.htm"; // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問 public static String return_url = URL.url + "/d_/h5_shopping/m_shoppingPayMentResult.html"; public static String return_url2 = URL.url + "/d_/dk_native/group_collage/authen_waiting.html"; public static String show_url=URL.url + "/d_/h5_shopping/m_shoppingPayMentResult.html"; // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可d以正常訪問 public static String return_url_cart5 = URL.url + "/d_/h5_shopping/m_shoppingMyOrder.html"; public static String show_url_cart5=URL.url + "/d_/h5_shopping/m_shoppingMyOrder.html"; // 簽名方式 public static String sign_type = "MD5"; // 調試用,創建TXT日志文件夾路徑,見AlipayCore.java類中的logResult(String sWord)打印方法。 public static String log_path = "d:\\"; // 字符編碼格式 目前支持utf-8 public static String input_charset = "utf-8"; // 支付類型 ,無需修改 public static String payment_type = "1"; // 調用的接口名,無需修改 public static String service = "alipay.wap.create.direct.pay.by.user"; public static String aliPayUrl="https://openapi.alipay.com/gateway.do"; //app支付寶id public static String appId="20171013****3857"; //支付寶私鑰 public static String developerSpoon="MIIEvQIBA****************ASCBKcwggSjAgEAAoIBAQCRlROPLQ2spEhfeEDGeovFIRzINwTSStKk+fdHg/4sP5xF/B4m3LuBeOidjZrfWdVtPKExfKf+6fdRuIoP6PxLeq5+z16BKOx3xeEI2tH81couOufEaZWniT6E3UpbA5H6lHLlAklm/KeCJlPhJvWYVBK/o6ZrEY6yCkSkEGIJtxU5i6nPyNJfGbllJe9Y0D3S/lCCaDKZk+R7MGDHfqYrm3A6hICIXfwq9K+8EoB+nscpjtyScc0iX29BZgJovx303v0JyGFN6yQWFJbE6TcOY4+GfYOBmFYaNE3l7ffNyRrhszIVXwnuitvc/Vf2JDTxpf8+JclB+/hAcbAS38jhAgMBAAECggEBAIubWRFhFA7tz9V1nTB4jhZxZYd+c2oyhIPejcqQAituqK7YUhXUcR980h1ckRsEq83AaZfqQbQLq7c7b3JIa8D6GeHTfH4Bv5owMVfrd5mtbuAcbuuEkRYDX+fLyiUzbEbPGssQAVH4ka4WkTOFx9jXLs+F4O4l/SAxBpgKeelzqaGUQQulbnZQR33xZhz4cYTkaZBQ26eEZqBlLBGw6bbJC22TU19AYJUeA6e1MDG7E4n7AzDmI/ebulukRwDlIdmJ1+6qas0nUqUFuvl+ugpIp/3NZablRMTP+pexG0r5VjvwM2R5OPDDmdQxv6YFWmQQwYWIoE3LhlkTc22+qAECgYEA3r0ShEnUMBHrX/MXtP/eIeRZkBhN2InO6PN/BswWuSSx/5oNmP2MoIKLZoXlvISjGuRHBKEn4Cg20W35HwOVFG41WpTeLupMMEYJrWO1kPW3qs6DZmRzABcvZeoFeq0ZX0boB1buNrrYB59a2g9449pwv8vQFHI+UqL7SabZKiECgYEAp1Jy1qN1CfIa9PEnXVL3ws8rNlHXE26BAmcWDk6pdPP3sR02fw6+WBqV98YJBJW0Eu6ReSvpXNI1SO1I4H16SbpdAAY7PS5o50ooNzBGAmtqVMijv3tZ8Ofuo7Dk2OR+3RQgMYX6Hu4n0HMDmyL85ZaYJ8ZmlDPLygVC5OdiRsECgYBRGHvGaG719YBCFeravpHsuwwU15R4M2x/CjCElAft7rtT+Y3b1uy9f+orMLL9WTldUCG/QMGY7mtPAwBB13cO0jVgvnTKlgmZRda+J2By39O4P6o9vHLWZJqgO301NhLXyqQuD+t5R7vhwpY8cIeuRdjpK9adqx6fzbE6FqJYoQKBgDJ7eLRzmrNGfYWbYLISfzgigzofVRHCzF+qNIhaiVwE451nX/LTwvAYDVk1QbFFbZAstG1npz/fGD6JgOxiT0wBU1/XgXYDE5l80UddZDIEsI8l/eme0NMTVvfCPjmGLxSKpu/qKT29wvtsSBE9bCnk1sFhZb+fJQQttDIV8ZvBAoGAfEESjokpGPTHOCDCGmVnnbas7b5FaIx6wAkvM3HmM4LJfYywD7xuV3WDiY71rPJ+lKuWwF5NM5uuZ4WTKamiFycKiZUha96Btogp9yUR9MTS3KTsQ6Kk7tM7QWdTFEnTVVAP5GXYFafRPYFRFfaYUA+p6yyRUoUeDZ5WGcEcDUI="; //支付寶公鑰 public static String aliPaySpoon="MIIBIjANBgkqh**************KCAQEAyIYSK5SY8pXXRTkqZZM8sTeJ6hpNq5C7SK+dya/eLCoXnwnQ8kQL6BbRMngKplLeZQv9cCRRNfc9p5beFUTjEVwwXXz/i4Vo8yzAZEhcWxf5ksyW3aNCK9wEkaQfZ52G0jTtDDy0J4hTBSTtVmRz1PvBxTsnaoVPTi8XCXKtI6bZ7LQr4hCsPioXDVU1cdtnc3G7CT5WLeCQCGJD/HtsrbZmHse+6tR+V6tan5k83ytsqrs9VgC2rYIM/Gghghb9zGxmLSxqmcTZOgO43XWZuTeqsFRHYXfueHKnozxxMfD8mY3knSi0Ey0ZiZMlEdpaP9bI9S8paN+nvN1CsV8bzwIDAQAB"; //新的公鑰APP用的公鑰 public static String aliPaySpoonNew="MIIBIjANBgkqh************AQ8AMIIBCgKCAQEAkZUTjy0NrKRIX3hAxnqLxSEcyDcE0krSpPn3R4P+LD+cRfweJty7gXjonY2a31nVbTyhMXyn/un3UbiKD+j8S3qufs9egSjsd8XhCNrR/NXKLjrnxGmVp4k+hN1KWwOR+pRy5QJJZvyngiZT4Sb1mFQSv6OmaxGOsgpEpBBiCbcVOYupz8jSXxm5ZSXvWNA90v5QgmgymZPkezBgx36mK5twOoSAiF38KvSvvBKAfp7HKY7cknHNIl9vQWYCaL8d9N79CchhTeskFhSWxOk3DmOPhn2DgZhWGjRN5e33zcka4bMyFV8J7orb3P1X9iQ08aX/PiXJQfv4QHGwEt/I4QIDAQAB"; // ↑↑↑↑↑↑↑↑↑↑請在這里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ public static String notify_url_light_service_callback = URL.url+"/json/appAlipayLightService_goods.htm"; public static String notify_url_videoCourseTopic_callBack = URL.url+"/json/aliPayVideoCourseTopic_callBack.htm"; public static String notify_url_lightservice_video_callback = URL.url+"/json/aliPaylightService_video_callBack.htm"; public static String aliyun_notify_url_ApplyMavinOrder = URL.url + "/json/pay_aliyun_ApplyMavinOrder_callBack.htm"; public static String aliyun_notify_mavinEnter_callBack = URL.url + "/json/aliyun_mavinEnter_callBack.htm"; public static String aliyun_notify_lightService0_goods_callBack = URL.url + "/callback/aliyun_notify_lightService0_goods_callBack.htm"; public static String aliyun_notify_url_AuditOrder_callBack = URL.url + "/notify/pay_ali_auditOrder_callBack.htm"; }
測試生成的H5返回的From表單是否有效,直接寫一個HTML。將測試的串放在里面。例如:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form name="punchout_form" method="post" action="https://openapi.alipay.com/gateway.do?sign=Q5F5g3u1WzCWMjKcmlzzcDmTzOONj726qM3OF8RJP5axv2nOC5lfnslpLesalgUt%2FScgSUknzQYxQzshixIS5TcHIvofFHQSd9j5a8CiolwXcKREwupcplapxxXtvUm94J2%2FgvuFjk%2F989Pt2Qf6h6c6tx3LilC4%2B8nWS2WnlGvR0jWty0KzChX3VEscN6zxTEpZz98jQhc6p29lupsYQEif97OVgljhX8PcNgA%2B5fm%2F7K5dsLvF7KSpuZi4%2FGFYZ2FrQNx8oRFErl7IRsPK5%2FL1cdaIwckgmNbcdffElVddJ6RYsk8UtnND2XPVRtvDLTucTOVyjVpXMD1rdMV6xw%3D%3D×tamp=2019-08-08+12%3A14%3A03&sign_type=RSA2¬ify_url=http%3A%2F%2Faptest.yingyanghome.com%2FappTeamAlipayReturn.htm&charset=utf-8&app_id=2017101309283857&method=alipay.trade.wap.pay&return_url=http%3A%2F%2Faptest.yingyanghome.com%2Fd_%2Fh5_shopping%2Fm_shoppingPayMentResult.html&version=1.0&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json"> <input type="hidden" name="biz_content" value="{"body":"H5進行東康簽約小組","out_trade_no":"3820120190808121403","subject":"支付東康","timeout_express":"30m","total_amount":"0.02"}"> <input type="submit" value="立即支付" style="display:none" > </form> <script>document.forms[0].submit();</script> </body> </html>
看一下能否跳轉