支護寶api接口開發

  支付寶的接口和微信的DEMO和文檔真心太難看懂了,亂七八糟,都不知道去哪裏找本身要的東西,最近幾天咱們公司須要作相似的開發,我做爲先鋒,率先解決Java集成支付寶支付和微信支付接口工做。html

  咱們的工做環境:JSP網站+支付接口,目前工做的支付寶接口爲20160912,微信爲V3版本,如遇到版本升級,請聯繫相關機構的客戶服務人員升級。java

  本文介紹JSP+支付寶接口,本文非原創。json

 

  新手注意:api

一、本文使用的接口地址和參數爲沙箱的地址,不管你在使用沙箱或者正式地址,務必覈實使用接口地址和參數,不要想固然。數組

二、本文使用JAR包:微信

alipay-sdk-java20160912220103.jar
commons-codec-1.6.jar
commons-httpclient-3.0.1.jar
commons-logging-1.1.1.jar
fastjson-1.2.7.jar
json-lib-2.2.3-jdk13.jar
json.jar
jsp-api.jar
servlet-api.jar微信開發

 

說明:app

alipay-sdk-java 是官方支付SDK,請到官方下載,本文使用版本20160912dom

 

首頁調用:jsp

 

[html]  view plain  copy
 
  1. <!--頁面-->
    <%
    CsPay pay=new CsPay();
    pay.doPost(request, response);
    %>

 

[java]  view plain  copy
 
  1. package com.luozhuang.alipay;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import com.alibaba.fastjson.JSON;  
  7. import com.alipay.api.AlipayApiException;  
  8. import com.alipay.api.AlipayClient;  
  9. import com.alipay.api.DefaultAlipayClient;  
  10. import com.alipay.api.internal.util.StringUtils;  
  11. import com.alipay.api.request.AlipayTradeCancelRequest;  
  12. import com.alipay.api.request.AlipayTradePayRequest;  
  13. import com.alipay.api.request.AlipayTradePrecreateRequest;  
  14. import com.alipay.api.request.AlipayTradeQueryRequest;  
  15. import com.alipay.api.request.AlipayTradeRefundRequest;  
  16. import com.alipay.api.request.AlipayTradeWapPayRequest;  
  17. import com.alipay.api.response.AlipayTradeCancelResponse;  
  18. import com.alipay.api.response.AlipayTradePayResponse;  
  19. import com.alipay.api.response.AlipayTradePrecreateResponse;  
  20. import com.alipay.api.response.AlipayTradeQueryResponse;  
  21. import com.alipay.api.response.AlipayTradeRefundResponse;  
  22.   
  23. public class AlipayClientFactory {  
  24.     private static final AlipayClient client = new DefaultAlipayClient(  
  25.             Config.URL, Config.APPID, Config.RSA_RRIVATE_KEY, Config.FORMAT,  
  26.             Config.CHARSET, Config.ALIPAY_PUBLIC_KEY);  
  27.   
  28.     public static AlipayClient getAlipayClientInstance() {  
  29.         return client;  
  30.     }  
  31.   
  32.     /** 
  33.      * appAuthToken 
  34.      * 如ISV代替商家調用當面付接口,需將商戶受權後獲取的app_auth_token帶上;如商家申請當面付本身調用,則傳null bizContent 
  35.      * JSON格式 商戶的請求參數 
  36.      */  
  37.   
  38.     // 手機網頁支付 網站支付  
  39.     public String ydAndPc_Pay(Map<String, String> maps)  
  40.             throws AlipayApiException {  
  41.         AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();  
  42.         String NotifyUrl = maps.get("NotifyUrl");  
  43.         String ReturnUrl = maps.get("ReturnUrl");  
  44.         // 後臺回調  
  45.         if (!StringUtils.isEmpty(NotifyUrl)) {  
  46.             alipayRequest.setNotifyUrl(NotifyUrl);  
  47.             // bizContent 中不須要 公共參數  
  48.             maps.remove("NotifyUrl");  
  49.         }  
  50.         // 頁面回調  
  51.         if (!StringUtils.isEmpty(ReturnUrl)) {  
  52.             alipayRequest.setReturnUrl(ReturnUrl);  
  53.             // bizContent 中不須要 公共參數  
  54.             maps.remove("ReturnUrl");  
  55.         }  
  56.         String bizCon = JSON.toJSONString(maps);  
  57.         alipayRequest.setBizContent(bizCon);  
  58.         String form = "";  
  59.         try {  
  60.             form = AlipayClientFactory.getAlipayClientInstance()  
  61.                     .pageExecute(alipayRequest).getBody();  
  62.         } catch (AlipayApiException e) {  
  63.             form = "err";  
  64.             e.printStackTrace();  
  65.         } // 調用SDK生成表單  
  66.         return form;  
  67.     }  
  68.   
  69.     // 查詢訂單狀態  
  70.     public AlipayTradeQueryResponse query(String appAuthToken, String bizContent)  
  71.             throws AlipayApiException {  
  72.         AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();  
  73.         request.putOtherTextParam("app_auth_token", appAuthToken);  
  74.         request.setBizContent(bizContent);  
  75.         return AlipayClientFactory.getAlipayClientInstance().execute(request);  
  76.     }  
  77.   
  78.     // 條碼支付  
  79.     public AlipayTradePayResponse pay(String appAuthToken, String bizContent)  
  80.             throws AlipayApiException {  
  81.         AlipayTradePayRequest request = new AlipayTradePayRequest();  
  82.         request.putOtherTextParam("app_auth_token", appAuthToken);  
  83.         request.setBizContent(bizContent);  
  84.         return AlipayClientFactory.getAlipayClientInstance().execute(request);  
  85.     }  
  86.   
  87.     // 掃碼支付  
  88.     public AlipayTradePrecreateResponse precreate(String appAuthToken,  
  89.             String bizContent) throws AlipayApiException {  
  90.         AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();  
  91.         request.putOtherTextParam("app_auth_token", appAuthToken);  
  92.         request.setBizContent(bizContent);  
  93.         return AlipayClientFactory.getAlipayClientInstance().execute(request);  
  94.     }  
  95.   
  96.     // 訂單撤銷  
  97.     public AlipayTradeCancelResponse cancel(String appAuthToken,  
  98.             String bizContent) throws AlipayApiException {  
  99.         AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();  
  100.         request.putOtherTextParam("app_auth_token", appAuthToken);  
  101.         request.setBizContent(bizContent);  
  102.         return AlipayClientFactory.getAlipayClientInstance().execute(request);  
  103.     }  
  104.   
  105.     // 申請退款  
  106.     public AlipayTradeRefundResponse refund(String appAuthToken,  
  107.             String bizContent) throws AlipayApiException {  
  108.         AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();  
  109.         request.putOtherTextParam("app_auth_token", appAuthToken);  
  110.         request.setBizContent(bizContent);  
  111.         return AlipayClientFactory.getAlipayClientInstance().execute(request);  
  112.     }  
  113.   
  114.     @SuppressWarnings("unused")  
  115.     public static void main(String[] args) {  
  116.         AlipayClientFactory c = new AlipayClientFactory();  
  117.         try {  
  118.             Map<String, String> map = new HashMap<String, String>();  
  119.             map.put("out_trade_no", "20160914113218");  
  120.             String bizContent = JSON.toJSONString(map);  
  121.             System.err.println(bizContent);  
  122.             AlipayTradeQueryResponse rp = c.query(null, bizContent);  
  123.         } catch (AlipayApiException e) {  
  124.             e.printStackTrace();  
  125.         }  
  126.     }  
  127. }  

 

 

 

[java]  view plain  copy
 
  1. package com.luozhuang.alipay;  
  2.   
  3. public class Config {  
  4.     // 開發者應用私鑰。java配置PKCS8格式,PHP/.Net語言配置rsa_private_key.pem文件中原始私鑰。  
  5.     public static final String RSA_RRIVATE_KEY ="luozhuang";  
  6.     // 接口請求網關。當面付支付、查詢、退款、撤銷接口中爲固定值  
  7.     public static final String URL = "https://openapi.alipaydev.com/gateway.do";  
  8.     // 商戶應用APPID,只要您的應用中包含當面付接口且是開通狀態,就能夠用此應用對應的appid。開發者可登陸開放平臺-管理中心-對應應用中查看  
  9.     public static final String APPID = "luozhuang";  
  10.     // 編碼字符集。默認 utf-8  
  11.     public static final String CHARSET = "utf-8";  
  12.     // 返回格式。默認json  
  13.     public static final String FORMAT = "json";  
  14.     // 支付寶公鑰,用於獲取同步返回信息後進行驗證,驗證是不是支付寶發送的信息。  
  15.     public static final String ALIPAY_PUBLIC_KEY = "luozhuang";  
  16. }  



 

 

[java]  view plain  copy
 
  1. package com.luozhuang.alipay;  
  2.   
  3.   
  4. import java.io.IOException;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11. import com.alipay.api.AlipayApiException;  
  12.   
  13. /** 
  14.  * Servlet implementation class CsPay 
  15.  */  
  16. public class CsPay extends HttpServlet {  
  17.     private static final long serialVersionUID = 1L;  
  18.   
  19.     /** 
  20.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 
  21.      *      response) 
  22.      */  
  23.     public void doGet(HttpServletRequest request,  
  24.             HttpServletResponse response) throws ServletException, IOException {  
  25.         doPost(request, response);  
  26.     }  
  27.   
  28.     /** 
  29.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 
  30.      *      response) 
  31.      */  
  32.     public void doPost(HttpServletRequest request,  
  33.             HttpServletResponse response) throws ServletException, IOException {  
  34.         // 參數目前都是 寫死的 根據業務需求 寫活  
  35.         Map<String, String> maps = new HashMap<String, String>();  
  36.         maps.put("out_trade_no", UtilDate.getOrderNum());  
  37.         maps.put("total_amount", "0.01");  
  38.         maps.put("subject", "Iphone6 16G");  
  39.         maps.put("body", "Iphone6 16G");  
  40.         maps.put("product_code", "QUICK_WAP_PAY");  
  41.         // 下面兩個 參數的 KEY 不要亂寫 要和工具類裏面對應  
  42.         maps.put("ReturnUrl", "http://domain.com/CallBack/return_url.jsp");  
  43.         maps.put("NotifyUrl", "http://domain.com/CallBack/notify_url.jsp");  
  44.         try {  
  45.             AlipayClientFactory ali = new AlipayClientFactory();  
  46.             String form = ali.ydAndPc_Pay(maps);  
  47.             if (!form.equals("err")) {  
  48.                 response.setContentType("text/html;charset=utf-8");  
  49.                 response.getWriter().write(form);// 直接將完整的表單html輸出到頁面  
  50.                 response.getWriter().flush();  
  51.             }  
  52.         } catch (AlipayApiException e) {  
  53.             e.printStackTrace();  
  54.         }  
  55.     }  
  56. }  

 

[java]  view plain  copy
 
  1. package com.luozhuang.alipay;  
  2.   
  3.   
  4. import java.util.ArrayList;  
  5. import java.util.Collections;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.   
  9. public class CsUtil {  
  10.     /** 
  11.      * 把數組全部元素排序,並按照「參數=參數值」的模式用「&」字符拼接成字符串 
  12.      *  
  13.      * @param params 
  14.      *            須要排序並參與字符拼接的參數組 
  15.      * @return 拼接後字符串 
  16.      */  
  17.     public static String createLinkString(Map<String, String> params) {  
  18.   
  19.         List<String> keys = new ArrayList<String>(params.keySet());  
  20.         Collections.sort(keys);  
  21.   
  22.         String prestr = "";  
  23.   
  24.         for (int i = 0; i < keys.size(); i++) {  
  25.             String key = keys.get(i);  
  26.             String value = params.get(key);  
  27.   
  28.             if (i == keys.size() - 1) {// 拼接時,不包括最後一個&字符  
  29.                 prestr = prestr + key + "=" + value;  
  30.             } else {  
  31.                 prestr = prestr + key + "=" + value + "&";  
  32.             }  
  33.         }  
  34.   
  35.         return prestr;  
  36.     }  
  37. }  

 

[java]  view plain  copy
 
    1. package com.luozhuang.alipay;  
    2.   
    3.   
    4. import java.util.Date;  
    5. import java.util.Random;  
    6. import java.text.SimpleDateFormat;  
    7. import java.text.DateFormat;  
    8.   
    9. /* * 
    10.  *類名:UtilDate 
    11.  *功能:自定義訂單類 
    12.  *詳細:工具類,能夠用做獲取系統日期、訂單編號等 
    13.  *版本:3.3 
    14.  *日期:2012-08-17 
    15.  *說明: 
    16.  *如下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶能夠根據本身網站的須要,按照技術文檔編寫,並不是必定要使用該代碼。 
    17.  *該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。 
    18.  */  
    19. public class UtilDate {  
    20.       
    21.     /** 年月日時分秒(無下劃線) yyyyMMddHHmmss */  
    22.     public static final String dtLong                  = "yyyyMMddHHmmss";  
    23.       
    24.     /** 完整時間 yyyy-MM-dd HH:mm:ss */  
    25.     public static final String simple                  = "yyyy-MM-dd HH:mm:ss";  
    26.       
    27.     /** 年月日(無下劃線) yyyyMMdd */  
    28.     public static final String dtShort                 = "yyyyMMdd";  
    29.       
    30.       
    31.     /** 
    32.      * 返回系統當前時間(精確到毫秒),做爲一個惟一的訂單編號 
    33.      * @return 
    34.      *      以yyyyMMddHHmmss爲格式的當前系統時間 
    35.      */  
    36.     public  static String getOrderNum(){  
    37.         Date date=new Date();  
    38.         DateFormat df=new SimpleDateFormat(dtLong);  
    39.         return df.format(date);  
    40.     }  
    41.       
    42.     /** 
    43.      * 獲取系統當前日期(精確到毫秒),格式:yyyy-MM-dd HH:mm:ss 
    44.      * @return 
    45.      */  
    46.     public  static String getDateFormatter(){  
    47.         Date date=new Date();  
    48.         DateFormat df=new SimpleDateFormat(simple);  
    49.         return df.format(date);  
    50.     }  
    51.       
    52.     /** 
    53.      * 獲取系統當期年月日(精確到天),格式:yyyyMMdd 
    54.      * @return 
    55.      */  
    56.     public static String getDate(){  
    57.         Date date=new Date();  
    58.         DateFormat df=new SimpleDateFormat(dtShort);  
    59.         return df.format(date);  
    60.     }  
    61.       
    62.     /** 
    63.      * 產生隨機的三位數 
    64.      * @return 
    65.      */  
    66.     public static String getThree(){  
    67.         Random rad=new Random();  
    68.         return rad.nextInt(1000)+"";  
    69.     }  
    70.       
    71. }  
相關文章
相關標籤/搜索