zoukankan      html  css  js  c++  java
  • 支护宝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. }  
  • 相关阅读:
    HDU 2089 不要62
    HDU 5038 Grade(分级)
    FZU 2105 Digits Count(位数计算)
    FZU 2218 Simple String Problem(简单字符串问题)
    FZU 2221 RunningMan(跑男)
    FZU 2216 The Longest Straight(最长直道)
    FZU 2212 Super Mobile Charger(超级充电宝)
    FZU 2219 StarCraft(星际争霸)
    FZU 2213 Common Tangents(公切线)
    FZU 2215 Simple Polynomial Problem(简单多项式问题)
  • 原文地址:https://www.cnblogs.com/joyous-day/p/6928087.html
Copyright © 2011-2022 走看看