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. }  
  • 相关阅读:
    如何用js判断一个对象是不是Array
    js实现数组去重怎么实现?
    点击一个ul的五个li元素,分别弹出他们的序号,怎么做?
    盒子模型
    13. 查看网络端口、配置网络
    12. 查看系统硬件配置
    11. 系统状态管理
    9. iptables 配置
    10. 编译软件包
    8. 管理软件包
  • 原文地址:https://www.cnblogs.com/joyous-day/p/6928087.html
Copyright © 2011-2022 走看看