依赖:

  1. <!-- alipay-sdk-java 注意一下版本-->
  2. <dependency>
  3. <groupId>com.alipay.sdk</groupId>
  4. <artifactId>alipay-sdk-java</artifactId>
  5. <version>3.4.49.ALL</version>
  6. </dependency>

配置类:

  1. package com.sdk.pay.alipay;
  2.  
  3. public class AlipayConfig {
  4. // 商户appid
  5. public static String APPID = "2016102100729846";
  6. // 私钥 pkcs8格式的
  7. public static String RSA_PRIVATE_KEY =
  8. "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHiiREGifXUNV4" +
  9. "2QJixj0NEq4DgOBhjA3lTdQxCrJBeOBz7UUPXQfKw39LGKhoyrgPmJKzYwWosfIl" +
  10. "mFk4qvGGsxbvuIGW8aUpxwFR9PmUetgoLroko/6mddnCA1+pSkBVA2vZhKO7MgZc" +
  11. "onfJN305izNcGMSbYm20W0mAnmRCZgux5nZpFq6kUYP45WAmyMUoXVQOrUOb6Ec0" +
  12. "6+CPuTpeV32IWpW6Sr/Ukvxt6BNw+XMhwM7vrIYsN8RW50aMsOlTwACQ19G5EOKe" +
  13. "vA07urMxwdeEoDxggYFG0o4As6IxzlUdd4eYWKOuX1l0/zZpOCxQiMrXrv+eRZFa" +
  14. "lBPvN++3AgMBAAECggEAEt73qxEmL3DPn4w2c4z3/SKFHoOztMYAEm2X4cN3NEXw" +
  15. "REZuP5O2xvBSO5Hra22wlpkBVsHIqTmbAv8zgO55xRlu0+EJMHNOAXN2pn+akvZD" +
  16. "NxmkNQ7laGzA2V5kT6hcCS43puyqZ2vFukELPxZmW2jUxKL7BQ77/RCdFPLl3HmL" +
  17. "QEJsOITqf7+q8pMWaaKF3mesqzz8AGzD0LC/pQwCh7h6ur0ojle6hDslHMK7UkEY" +
  18. "QUTK+Kz6ZGgXJWIc3xsE0oG6O/+QgAgssoaKgDPFmzfOt4yq4cfCzx8xlDCBDmC6" +
  19. "hdqdegwICxqxmbKlp9cRnLnEOv3Q5gUB0YlorM3e8QKBgQD1eIeUJkyM2v1Gobtm" +
  20. "eOFdtblc2E5cy2P5DGC5nawCtpK3kIGDxDM8Np5xasRkwsaSovQkH1bJ5ocStwLX" +
  21. "rDOj57oENrdieIGEHP8ffpAVsa7SgTYUjwdyA79FsMEZWX1PanbqF7J3NS2coneg" +
  22. "HVkdPQXRkmXMuJ/l96ZSMxGfJQKBgQDQGT/4B8LSCv62WaQHMnMyNdxCbg/135ov" +
  23. "suMymgGre13onOblCyUb3SnvOAO1vnSHWNbmj5Knz5/cRYzxBAPXaJ0gYVJkMxEy" +
  24. "nQelWCBhPRqfRIjeHTN9F98g2fsTArPy1zhR+NzwSdRx4aL08beDOwYIMPZuTGod" +
  25. "xmt58L96qwKBgGQDXcog6KOjPfqfPsl7iucxeXq4rwTj4bHBN0+pTEI2vQSJnhtf" +
  26. "vzhTUK8JP0eGjH2GY06sbiIJCRO4+TGCee/YJFQ/LuyyCKMZZWEhofcU1BP0jWJG" +
  27. "/FOZ7z6ny6VWbtYCnLy4NwCW7CSblX3pNzvQdyRyL4P/3TZHdr6bDBz5AoGBAJQW" +
  28. "w+0QKNYsuOKvnAj7H/tFVP95L6Z7f1Aeb4xdCH8uBcA5mB669aeElgkExa8aX/bJ" +
  29. "g/UDiwwctticLhZ+EvXCHr8iQu3HYZ+xG/XQZwqL31wj+3qFMVT+He1U8lWvALv5" +
  30. "6Lx8602cXLDGL588PKoI4NwHa/dGLeYOhAF9D+aNAoGBAK6geTKYSbdh/0IEBxSx" +
  31. "kMVx4D1pYKUOgTEqGuw7IYeNrwwE/F/SVhgkpAvz3ppYUM+bsPHbofEu7W/uanP8" +
  32. "2Akf8D0dpTcQju+6MuQmCPcLmJSq2pqVNHG4gUnzz5CZoi+IrK/VMTXfU2O+i+H0" +
  33. "rGQXtgvpSTBHlrcRklSvYjaC";
  34. // 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
  35. public static String notify_url = "http://28k6010n77.wicp.vip/callback.html";
  36. // 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
  37. public static String return_url = "http://28k6010n77.wicp.vip/return.html";
  38. // 请求网关地址
  39. public static String URL = "https://openapi.alipaydev.com/gateway.do";
  40. // 编码
  41. public static String CHARSET = "UTF-8";
  42. // 返回格式
  43. public static String FORMAT = "json";
  44. // 支付宝公钥
  45. public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAov3L35qUSYI2E5iDZmjXgJJs4cWKW2LhaddgKw5D7UgFYOcOv/ZYf5SdiWVk4tjhhJxFy1iDRxB+V5d0KD0cOc0PHBA0jQ6UfEu1BSV6rNL+ipgF1xLDudwT+iuVyKg2EEkFWb14Mm1D06qqen7yQyftzCU4TQ/gOUBzHcrQ5HJ1TxqgP0kHRUwe44utEwAMYNgJk9hxZ01ULVBQVAVxjGirju47OSIjnOCIfhk1fMrHIZreZFPp5uhzluJnIUHRugw+w7MunWy3iAOpNM47FKs4RuV/YHqeEdc1jFflAmeJhXT84ySuQZc6ZkwpY3JJc4ObGIchSj3SOqy1iSN9BwIDAQAB";
  46. // 日志记录目录
  47. public static String log_path = "/log";
  48. // RSA2
  49. public static String SIGNTYPE = "RSA2";
  50. }

controller:

  1. package com.sdk.pay.controller;
  2.  
  3. import com.alipay.api.AlipayApiException;
  4. import com.alipay.api.AlipayClient;
  5. import com.alipay.api.DefaultAlipayClient;
  6. import com.alipay.api.domain.AlipayTradeWapPayModel;
  7. import com.alipay.api.internal.util.AlipaySignature;
  8. import com.alipay.api.request.AlipayTradeWapPayRequest;
  9.  
  10. import com.sdk.pay.alipay.AlipayConfig;
  11. import org.springframework.stereotype.Controller;
  12. import org.springframework.web.bind.annotation.RequestMapping;
  13.  
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpServletResponse;
  16. import java.io.PrintWriter;
  17. import java.util.HashMap;
  18. import java.util.Iterator;
  19. import java.util.Map;
  20.  
  21. @Controller
  22. public class AliPayController {
  23. @RequestMapping("ali.html")
  24. public String page() {
  25. return "alipay";
  26. }
  27.  
  28. @RequestMapping("alipay.html")
  29. public void order(HttpServletRequest request, HttpServletResponse response, Integer amount) throws Exception {
  30. // 商户订单号,商户网站订单系统中唯一订单号,必填
  31. String out_trade_no = System.currentTimeMillis() + "";
  32. // 订单名称,必填
  33. String subject = "测试";
  34. System.out.println(subject);
  35. // 付款金额,必填
  36. String total_amount = amount.toString();
  37. // 超时时间 可空
  38. String timeout_express = "2m";
  39. // 销售产品码 必填
  40. String product_code = "QUICK_WAP_WAY";
  41. /**********************/
  42. // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
  43. //调用RSA签名方式
  44. AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
  45. AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest();
  46.  
  47. // 封装请求支付信息
  48. AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
  49. model.setOutTradeNo(out_trade_no);
  50. model.setSubject(subject);
  51. model.setTotalAmount(total_amount);
  52. // model.setBody(body);
  53. model.setTimeoutExpress(timeout_express);
  54. model.setProductCode(product_code);
  55. alipay_request.setBizModel(model);
  56. // 设置异步通知地址
  57. alipay_request.setNotifyUrl(AlipayConfig.notify_url);
  58. // 设置同步地址
  59. alipay_request.setReturnUrl(AlipayConfig.return_url);
  60.  
  61. // form表单生产
  62. String form = "";
  63. try {
  64. // 调用SDK生成表单
  65. form = client.pageExecute(alipay_request).getBody();
  66. System.out.println(form);
  67. response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
  68. response.getWriter().write(form);//直接将完整的表单html输出到页面
  69. response.getWriter().flush();
  70. response.getWriter().close();
  71. } catch (AlipayApiException e) {
  72. // TODO Auto-generated catch block
  73. e.printStackTrace();
  74. }
  75. }
  76.  
  77. @RequestMapping("callback.html")//以回调方法为准
  78. public void callback(HttpServletRequest request, HttpServletResponse response) throws Exception {
  79. System.out.println("支付回调============callback.html==================================");
  80. PrintWriter out = response.getWriter();
  81. //获取支付宝POST过来反馈信息
  82. Map<String, String> params = new HashMap<String, String>();
  83. Map requestParams = request.getParameterMap();
  84. for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
  85. String name = (String) iter.next();
  86. String[] values = (String[]) requestParams.get(name);
  87. String valueStr = "";
  88. for (int i = 0; i < values.length; i++) {
  89. valueStr = (i == values.length - 1) ? valueStr + values[i]
  90. : valueStr + values[i] + ",";
  91. }
  92. //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
  93. //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
  94. params.put(name, valueStr);
  95. }
  96. //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
  97. //商户订单号
  98.  
  99. String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
  100. //支付宝交易号
  101.  
  102. String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
  103.  
  104. //交易状态
  105. String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
  106.  
  107. //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
  108. //计算得出通知验证结果
  109. //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
  110. boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
  111.  
  112. if (verify_result) {//验证成功
  113. //////////////////////////////////////////////////////////////////////////////////////////
  114. //请在这里加上商户的业务逻辑程序代码
  115.  
  116. //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
  117.  
  118. if (trade_status.equals("TRADE_FINISHED")) {
  119. //判断该笔订单是否在商户网站中已经做过处理
  120. //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
  121. //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
  122. //如果有做过处理,不执行商户的业务程序
  123.  
  124. //注意:
  125. //如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
  126. //如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
  127. } else if (trade_status.equals("TRADE_SUCCESS")) {
  128. //判断该笔订单是否在商户网站中已经做过处理
  129. //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
  130. //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
  131. //如果有做过处理,不执行商户的业务程序
  132. //注意:
  133. //如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
  134. //更新订单
  135. System.out.println("商户订单号:" + out_trade_no);
  136. System.out.println("支付宝订单号:" + trade_no);
  137. System.out.println("支付宝金额:" + request.getParameter("total_amount"));
  138. }
  139.  
  140. //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
  141. out.println("success"); //请不要修改或删除
  142.  
  143. //////////////////////////////////////////////////////////////////////////////////////////
  144. } else {//验证失败
  145. out.println("fail");
  146. }
  147. out.close();
  148. }
  149.  
  150. @RequestMapping("return.html")//只给用户一个提示
  151. public void success(HttpServletRequest request, HttpServletResponse response) throws Exception {
  152. System.out.println("return.html======只给用户一个提示========================================");
  153. response.setCharacterEncoding("utf-8");
  154. response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
  155. PrintWriter out = response.getWriter();
  156. //获取支付宝GET过来反馈信息
  157. Map<String, String> params = new HashMap<String, String>();
  158. Map requestParams = request.getParameterMap();
  159. for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
  160. String name = (String) iter.next();
  161. String[] values = (String[]) requestParams.get(name);
  162. String valueStr = "";
  163. for (int i = 0; i < values.length; i++) {
  164. valueStr = (i == values.length - 1) ? valueStr + values[i]
  165. : valueStr + values[i] + ",";
  166. }
  167. //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
  168. //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
  169. System.out.println(valueStr);
  170. params.put(name, valueStr);
  171. }
  172. System.out.println(params);
  173. //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
  174. //商户订单号
  175.  
  176. String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
  177.  
  178. //支付宝交易号
  179.  
  180. String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
  181.  
  182. //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
  183. //计算得出通知验证结果
  184. //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
  185. boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);
  186.  
  187. if (verify_result) {//验证成功
  188. //////////////////////////////////////////////////////////////////////////////////////////
  189. //请在这里加上商户的业务逻辑程序代码
  190. //该页面可做页面美工编辑
  191. out.flush();
  192. out.println("验证成功<br />");
  193. //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
  194.  
  195. //////////////////////////////////////////////////////////////////////////////////////////
  196. } else {
  197. //该页面可做页面美工编辑
  198. out.flush();
  199. out.println("验证失败");
  200. }
  201. out.close();
  202. }
  203. }

html:

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="alipay.html" method="post">
  9. 金额<input name="amount"/>
  10. <input type="submit" value="提交"/>
  11. </form>
  12. </body>
  13. </html>

调用支付宝接口的简单demo的更多相关文章

  1. android应用程序如何调用支付宝接口

    最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...

  2. android应用程序如何调用支付宝接口(转)

    最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...

  3. Android 开发之Android 应用程序如何调用支付宝接口

    1.到支付宝官网,下载支付宝集成开发包 由于android设备一般用的都是无线支付,所以我们申请的就是支付宝无线快捷支付接口.下面是申请的地址以及下载接口开发包的网址:https://b.alipay ...

  4. Android之应用程序怎样调用支付宝接口

    http://blog.csdn.net/lilidejing/article/details/19483717 近期在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口.由于用的人比 ...

  5. 调用支付宝接口Android客户端没有支付宝APP的情况下解决无法调用支付宝页面的问题

    这几天一直研究支付宝接口调用,因为当前应用中需要调用支付宝接口作移动支付. 遇到一个问题困扰几天,就是当我们的手机端未安装支付宝APP的时候,需要在自己应用中调用支付宝的登陆网页进行支付.我是Andr ...

  6. Django 调用支付宝接口

    目录 一  支付宝接口 二  视图函数 支付宝支付 正式环境:用营业执照,申请商户号,appid 测试环境:沙箱环境:https://openhome.alipay.com/platform/appD ...

  7. 在线支付接口之PHP支付宝接口开发简单介绍

    php100:92:在线支付接口之PHP支付宝接口开发 支付接口一般是第三方提供的代收款.付款的平台,可以通过支付接口帮助企业或个人利用一切可以使用的支付方式.常见支付平台:支付宝.快钱.云网支付.财 ...

  8. C# 如何创建接口以及使用接口的简单Demo(转载!)

    //No:1  首先,我们要封装一个接口,接口中不要实现具体的方法(说白了这就是一个架子而已!) using System;using System.Collections.Generic;using ...

  9. 调用支付宝第三方接口(沙箱环境) SpringMVC+Maven

    一.蚂蚁金服开放平台的操作 网址:https://open.alipay.com/platform/home.htm 支付宝扫码登陆

随机推荐

  1. C#验证码 使用GDI绘制验证码

    首先展示一下效果图如下: C#中的GDI特别方便,很多方法我们只要简单的调用就可以实现很复杂的功能.具体实现过程如下: 首先创建一个windows窗体应用(测试使用,实际开发winform程序时在需要 ...

  2. 一百零四、SAP中ALV事件之十六,让ALV表格能点击修改

    一.上一篇我们写到生产的ALV表格,但是表格内容不支持修改,如果我们需要修改下图的数量,需要怎么操作呢 二.代码如下,设置 ls_fieldcat-edit = 'X'.   "允许编辑. ...

  3. 4. Retrieving a mapper(检索映射器)

    Retrieving a mapper(检索映射器) 4.1. The Mappers factory(映射工厂) 可以通过 org.mapstruct.factory.Mappers 类检索映射器实 ...

  4. 吴裕雄--天生自然C++语言学习笔记:C++ 模板

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式.库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单 ...

  5. bash 内嵌命令 printf 用于进制转换

    printf - 格式化并显示数据 printf "%d" 0x10 printf "%x" 16

  6. Spring入门之二-------SpringIoC之实例化Bean以及注入Bean

    一.实例化Bean 1. 通过默认构造方法实创建Bean public class Bean1 { public Bean1() { System.out.println(this.getClass( ...

  7. MFC 根据字符宽度居中

    Gdiplus::Font font(_T("微软雅黑"), (Gdiplus::REAL)130); Gdiplus::RectF orgin(0.0f, 100.0f, nWi ...

  8. 人人嫌丑的iPhoneX刘海屏为何会被手机厂商竞相模仿

    不得不提到的是,苹果的iPhone自发布以来就始终引领着智能手机发展的方向.比如iPhone一代出现之后,就慢慢将键盘手机赶下历史舞台,让触屏手机成为主流.此外,iPhone的指纹识别.金属机身.玻璃 ...

  9. dns、网关、IP地址,主要是配置resolv.conf\network\ifcfg-eth0

    Ubuntu sudo vi /etc/network/interfac   添加 dns-nameservers 192.168.1.254dns-search stonebean.com cent ...

  10. RecyclerView使用介绍

    来源 http://jinyudong.com/2014/11/13/Introduce-RecyclerView-%E4%B8%80/ 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在 ...