紧跟上篇博客,本篇将书写具体的代码实现

开发环境:SSM、maven、JDK8.0

1.Maven坐标

<!--阿里支付-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.4.49.ALL</version>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>

2.AliOrderDTO 实体

public class UPOrder {
//get/set自己操作
private String code;//商户订单号
private String orderName;//订单名称
private BigDecimal paymentAmount;//付款金额
private String productDesc;//商品描述
private String createBy;//创建人Code
private Long createTime;//创建时间(时间戳)
private Integer createByType;//创建人类型 1-专家 2-企业用户
private Boolean status;//是否付款 true - 已付 false-未付
private Long payTime;//订单支付时间-支付后才存在 (时间戳)
public String getCode() {
return code;
}
}

  3.UPOrder 实体

public class AliOrderDTO {
//get/set自己操作
private String code;//商户订单号
private String aliTransactionNum;//支付宝交易号
private BigDecimal paymentAmount;//退款金额
private String refundCause;//退款原因
private String refundNum;//退款请求号
}

  4.配置文件AlipayConfig

public class AlipayConfig {

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

	// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String APPID = "2016092700611035"; // 商户私钥,您的PKCS8格式RSA2私钥
public static String RSA_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDP1hzPIGDA7XHmPpSIwvZVBGU1wsVYKactul5v4bJSV3Le0zGhV82GIP0ByX9tNzU+//kaxFgRsdZyPvR28iDbf9IaVZ+n+cZHA2rvevmntzoi3wMSEhfi8gHmY3+FuUALmICcK8a8rNV5qjpzRAyOb0IRLh1OxtCb64caKQivIt6OTEmLvyJ9BFdYbOSxHWpaOd6UMoXzG9gUzoRkMQiv9bGPkbOjxSXvYZXIXMF9OH+aHQ0oB94Od/Y/uc1xav23hPEq7HfaEMdNc3ZeRxC2JRGZm0HEn360hQ5fduE5QHnC0havpecvPNmmJv18KmYPICvK0WEONXQzZkd7ieWZAgMBAAECggEAPCPk6jqgRLNwxgNNz9U6mpdPAiN+H2jOK3lGYnGYvCL55miOb/WMT0e0bpPz/5J+IeDIIGq4YUZom16ENvcRcvKlxWEJdf3c1iezBeE75MAsXnLR3KTHrLACxLv95qAYXEKg1JAGTgplK3OKvlfumjivkXEaofT94GBjE7rT/HlBDUQd7fofu337fkVlzaluL9n6KwPyFoOhEoXz/ESANlcAzFxEdrHJ+41ywfivpCmPYipJ5RlPcvrxYPQVVcID9yxJmYl+yT+5zq+RENQw9UErKwufO27wMmlk8h9qnJ353Q5qzlI1XuziW27e+WcuCKA5KjPQDTW0FQX46+auAQKBgQDsM2A34G4bxF4FrKQMXYK+9AeN7jnOiObVigJWDQJdDmE6ajFJyjywSMJdJHFkt093jq1Q7GbFQratvXnsKw808gBqlUDHruHfQyAjB7Euwo/uj+Rf64wFSYeNyPz5Y4ZzTW/egp0+fNlwdQueF/ZxTix3Kveopju05OdP5LsDKQKBgQDhQhFWfLdhrzsmCbo1+FwI9XLQcijrwkDJcDCwjSw77Utdc7ZB9b47Qw8gPdGHsHUNST2SO0MUolxpcslhK0LCp2JH+jmyLvutCwJHge2ajEHr9UQNwqNT0VjfvLOCsqy1XjcT4UMkVbLuZfQVkuGeQMlZAz7vMwjnLHM5OWYM8QKBgQCx7+YtUfJBEsZt6efPtOZZKgdC4dNEhxe2iHhIERbVuY5/bh5hY2witT1O47RU1k+UVrS0QNMPCboK2rGtu6aCEUlFAdlCVLmt8qiUGyhcfI/nfRjjNdRO61yl8GK7EUHpPM3ox2bj+zPnJxWwbIboRqbywzi9ITXbiZHEOyCzOQKBgERWMMBWMaP27zDI/q7k27b0D5LhLzzmv5Tc7kiBa4v6n0SImCBGlyGPZIVZe7l4dOpE7+LvC5i08OgkpKdP4n7/HLfNV7eQvVVv448iAZ1DM7SLwcuS4s3I0vd9XdAmuHKFVJw5WI8rWI8uavAokT3bVbolW/BhQTAwsfwIR8dhAoGAOnxoALzuKX647N6k8AQEdNGr6CsDfwVR050vJHDbYVAxocGifiNE64/LJyzG0lO3mj4eiVwpikwPMx1oDhPuDURXrLK0TNzBV8LsGQvf+mTDgabAo8Jf/fYY3Ea8NOnE4Zrg6mEC93C0rUHEfsO8g+B2Skvw+8p6M6SHsmNsthw="; // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz9YczyBgwO1x5j6UiML2VQRlNcLFWCmnLbpeb+GyUldy3tMxoVfNhiD9Acl/bTc1Pv/5GsRYEbHWcj70dvIg23/SGlWfp/nGRwNq73r5p7c6It8DEhIX4vIB5mN/hblAC5iAnCvGvKzVeao6c0QMjm9CES4dTsbQm+uHGikIryLejkxJi78ifQRXWGzksR1qWjnelDKF8xvYFM6EZDEIr/Wxj5Gzo8Ul72GVyFzBfTh/mh0NKAfeDnf2P7nNcWr9t4TxKux32hDHTXN2XkcQtiURmZtBxJ9+tIUOX3bhOUB5wtIWr6XnLzzZpib9fCpmDyArytFhDjV0M2ZHe4nlmQIDAQAB"; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://d9tc3e.natappfree.cc/alipay/notify_url.jsp"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问,
//标红的域名为内网穿透工具生成的域名,没启动一次穿透工具,生成的域名都不一样,所有启动一次都需要进行修改
public static String return_url = "http://aa7xmz.natappfree.cc/alipay/return_url.jsp";
//请求网关地址
public static String URL="http://aa7xmz.natappfree.cc/gateway.do";
// 签名方式
public static String SIGNTYPE = "RSA2";
// 字符编码格式
public static String CHARSET = "utf-8";
//返回格式
public static String FORMAT="json";
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
// 支付宝网关
public static String log_path = "/log";

  5.控制层

@Controller
@RequestMapping("/pay/")
public class payCotroller { /**
*@description: 生成充值余额订单(支付宝充值)
*@author:cyb
*@date: 2019-03-11 10:12
*@param:
*@return: net.sf.json.JSONArray
*/
@RequestMapping("topUpBalance")
public void topUpBalance(UPOrder order, HttpServletResponse response){
//获得初始化的AlipayClient
//参数: URL APPID RSA_PRIVATE_KEY json ALI_CHARSET ALIPAY_PUBLIC_KEY SIGNTYPE
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(GetPayInfo.getProperyByFourthWay("ALI_RETURN_URL"));
alipayRequest.setNotifyUrl(GetPayInfo.getProperyByFourthWay("ALI_NOTIFY_URL")); //商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = new String(order.getCode());
//付款金额,必填
String total_amount = new String(order.getPaymentAmount().toString());
//订单名称,必填
String subject = new String(order.getOrderName());
//商品描述,可空
String body = new String(order.getProductDesc());
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"total_amount\":\""+ total_amount +"\","
+ "\"subject\":\""+ subject +"\","
+ "\"body\":\""+ body +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //请求
String result;
try {
result = alipayClient.pageExecute(alipayRequest).getBody();
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(result);// 直接将完整的表单html输出到页面
response.getWriter().flush();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
response.setContentType("text/html;charset=utf-8");
try {
response.getWriter().flush();
response.getWriter().write("1");// 直接将完整的表单html输出到页面
} catch (IOException e1) {
e1.printStackTrace();
}
}
} /**
*@description:支付宝退款
*@author:cyb
*@date: 2019-03-13 10:48
*@param: response
*@param: aliOrderDTO
*@return: void
*/
@RequestMapping("aliRefund")
public void aliRefund(HttpServletResponse response, AliOrderDTO aliOrderDTO){
try {
//获得初始化的AlipayClient
//URL APPID RSA_PRIVATE_KEY JSON CHARSET ALIPAY_PUBLIC_KEY SIGNTYPE
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
//设置请求参数
AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
//商户订单号,商户网站订单系统中唯一订单号
String out_trade_no = aliOrderDTO.getCode();
//支付宝交易号
String trade_no =aliOrderDTO.getAliTransactionNum();
//请二选一设置
//需要退款的金额,该金额不能大于订单金额,必填
String refund_amount = aliOrderDTO.getPaymentAmount().toString();
//退款的原因说明
String refund_reason = aliOrderDTO.getRefundCause();
//标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
String out_request_no = aliOrderDTO.getRefundNum();
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"trade_no\":\""+ trade_no +"\","
+ "\"refund_amount\":\""+ refund_amount +"\","
+ "\"refund_reason\":\""+ refund_reason +"\","
+ "\"out_request_no\":\""+ out_request_no +"\"}"); //请求
String result = alipayClient.execute(alipayRequest).getBody();
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(result);// 直接将完整的表单html输出到页面
response.getWriter().flush();
}catch (Exception e){
e.printStackTrace();
String result="1";
response.setContentType("text/html;charset=utf-8");
try {
response.getWriter().write(result);// 直接将完整的表单html输出到页面
response.getWriter().flush();
} catch (IOException e1) {
e1.printStackTrace();
} }
} /**
*@description: 异步支付的回调
*@author:cyb
*@date: 2019-03-12 14:24
*@param: request
*@return: void
*/
@RequestMapping("notify_url")
@ResponseBody
public JSONArray notify_url(HttpServletRequest request){
System.out.println("异步回调");
return msg200();
} /**
*@description:同步的回调方法
*@author:cyb
*@date: 2019-03-12 14:23
*@param: request
*@return: void
*/
@RequestMapping("return_url")
@ResponseBody
public JSONArray return_url(HttpServletRequest request){
System.out.println("同步回调");
return msg200();
}

 请求的效果:

1.支付宝支付:将返回的form表单写在一个HTML页面中运行,则会出现对应的支付页面让你进行支付

 

  支付成功后则会有个回调,回调的路径自己定义。

以上博客代码本人都亲测过,需要源码的可以联系本人,以上内容中有所不适的希望指出。另转载请说明出处,本人博客主页为:https://home.cnblogs.com/u/chenyuanbo/ ;

技术提升在于沟通交流!

java实现支付宝支付及退款(二)的更多相关文章

  1. java实现支付宝支付及退款(一)

    本篇博客主要做支付宝支付的准备工作(注册沙箱.natapp内网穿透等操作).具体代码实现操作请看下篇博客 一.登录沙箱 1.登录蚂蚁金服开发平台: https://open.alipay.com/pl ...

  2. 手把手教你完成App支付JAVA后台-支付宝支付JAVA

    接着上一篇博客,我们暂时完成了手机端的部分支付代码,接下来,我们继续写后台的代码. 后台基本需要到以下几个参数,我都将他们写在了properties文件中: 支付宝参数 AliPay.payURL = ...

  3. java调用支付宝 支付api 【沙箱环境】

    由于支付宝支付api需要各种备案,但学校项目需要引入支付功能  先演示  ,所以采用 沙箱环境 一.登录支付宝 开放平台 及配置相关 https://openhome.alipay.com/platf ...

  4. java开发支付宝支付详细流程_demo的运行

    首先我要吐槽一下支付宝的开放平台简直就是一个迷宫,赞同的顶一下,下面我把要下载的地址给贴出来要不真不好找: 一.准备工作 1.签名工具下载 https://docs.open.alipay.com/2 ...

  5. Java调用支付宝支付遇到的坑

    下单成功,回调不成功 原因:支付宝公钥填成商户公钥.这两个公钥是不一样的,但开头和结尾很多字符都一样,如果不用文本比对器比对很难发现!而且支付宝公钥填成商户公钥还能下单成功,只是回调不成功,这让原因更 ...

  6. Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)

    最近一直在接触第三方,刚接入完支付宝的API做一下总结,个人能力薄弱有不对的地方望指教.  做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档. 进入主题, ...

  7. Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝订单退款)

    上一篇写到支付宝的支付,这代码copy下来就能直接用了,   我写学习文档时会经常贴 官方参数文档的案例地址, 因为我觉得 请求参数,响应参数说明 官方文档整理的很好,毕竟官方不会误导大家. 我学一个 ...

  8. Java 支付宝支付,退款,单笔转账到支付宝账户(单笔转账到支付宝账户)

    上次分享了支付宝订单退款的代码,今天分享一下支付宝转账的操作.  现在是有一个余额提现的功能,本来是打算做提现到银行卡的,但是客户嫌麻烦不想注册银联的开放平台账户,就说先提现到支付宝就行,二期再做银行 ...

  9. 支付宝支付-常用支付API详解(查询、退款、提现等)

    所有的接口支持沙盒环境的测试 1.前言 前面几篇文件详细介绍了 支付宝提现.扫码支付.条码支付.Wap支付.App支付 支付宝支付-提现到个人支付宝 支付宝支付-扫码支付 支付宝支付-刷卡支付(条码支 ...

随机推荐

  1. 分布式系统监视zabbix讲解五之web监控--技术流ken

    Web 监控 概况 你可以使用 Zabbix 检查几个网站可用性方面. 如果要使用 Web 检测功能,必须在 编译Zabbix 的时候加入 cURL(libcurl) 的支持. 要使用 Web 监控, ...

  2. JavaScript 系列博客(四)

    JavaScript 系列博客之(四) 前言 本篇介绍 JavaScript 中的对象.在第一篇博客中已经说到 JavaScript 是一种''对象模型''语言.所以可以这样说,对象是 JavaScr ...

  3. 条件随机场conditional random field

    主要翻译自http://blog.echen.me/2012/01/03/introduction-to-conditional-random-fields/,原作者是MIT的大神,加入了一些我自己的 ...

  4. CSharp工程中的几个文件

    以下基于.NET Framework4.6及.NET Core2.0 .csproj 用于配置项目信息,如: 程序集名称.类型 Framework版本 项目所包含的文件信息,如:cs.html.js. ...

  5. 学习记录---C# Web程序获取客户端电脑信息

    问题描述:由于最近项目需要使用Mac地址与注册码进行加密处理,但是又因为Web程序的局限性不能获取客户端电脑系统信息,当然IE浏览器有一个activex控件他是可以通过Js在前端代码中直接获取的,局限 ...

  6. Java Date类的使用总结

    Date类表示特定的瞬间,精确到毫秒. 有2种方法可以创建Date对象(这里不考虑已过时的构造函数) 1.public Date()——分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫 ...

  7. vim 的:x和:wq

    vim是Unix/Linux系统最常用的编辑器之一,在保存文件时,我通常选择":wq",因为最开始学习vim的时候,就只记住了几个常用的命令:也没有细究命令的含义. 但是,最近我在 ...

  8. 2018年最值得关注的30个Vue开源项目

    译者按: 学习优秀的开源项目是提高代码水平最有效的方式. 原文: 30 Amazing Vue.js Open Source Projects for the Past Year (v.2018) 译 ...

  9. 字符串方法之padStart和padEnd

    ECMAScript 2017 有两个新的字符串方法:padStart和padEnd;  很有用啊啊,不用写if判断啦!开心脸 padStart在字符串开始出填充,padStart(num,‘要填充的 ...

  10. 写一个可插入自定义标签的 Textarea 组件

    - “插入自定义标签是什么鬼?” - “比如你要插入一个<wise></wise>的标签...” - “什么情况下会有这种需求?” - “得罪了产品的情况下...” 一.需求背 ...