支护宝api接口开发

Posted joyous

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了支护宝api接口开发相关的知识,希望对你有一定的参考价值。

  支付宝的接口和微信的DEMO和文档真心太难看懂了,乱七八糟,都不知道去哪里找自己要的东西,最近几天我们公司需要做类似的开发,我作为先锋,率先解决Java集成支付宝支付和微信支付接口工作。

  我们的工作环境:JSP网站+支付接口,目前工作的支付宝接口为20160912,微信为V3版本,如遇到版本升级,请联系相关机构的客户服务人员升级。

  本文介绍JSP+支付宝接口,本文非原创。

 

  新手注意:

1、本文使用的接口地址和参数为沙箱的地址,无论你在使用沙箱或者正式地址,务必核实使用接口地址和参数,不要想当然。

2、本文使用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

 

说明:

alipay-sdk-java 是官方支付SDK,请到官方下载,本文使用版本20160912

 

首页调用:

 

[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. }  














以上是关于支护宝api接口开发的主要内容,如果未能解决你的问题,请参考以下文章

支付宝支付接口开发的回调地址怎么写

H5网站接入支付宝的支付接口

支付宝支付 微信支付SDK接口不统一? 盘他!

支付宝支付接口

支付宝SDK怎么用

支付宝接口