当接到这个任务的时候,我说实话没搞过,之前搞过支付的,感觉退款应该很容易吧,但实际上并没有我想象的那么容易。(不是开发难,是别的问题)
首先,按照国际惯例,我先在支付宝的官网上查看开发文档
这就是咱们要开发的
必备文档
我是要用java开发
当看到这个的时候,应该就差不多了,按照这个写,不过按照这个写的时候,需要用到支付宝的sdk,导入几个jar包,不然程序会报编译错误。
需要的关键jar包:
开始编写代码:
/**
* 支付宝退款工具类
* @author WangXJ
*/
public class Aliaction {
/**
* @param out_trade_no 订单支付时传入的商户订单号,不能和 trade_no同时为空。
* @param trade_no 支付宝交易号,和商户订单号不能同时为空
* @param refund_amount 需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数
* @return 将提示信息返回
*/
public synchronized static String alipayRefundRequest(String out_trade_no,String trade_no,double refund_amount){
// 发送请求
String strResponse = null;
try {
AlipayClient alipayClient = new DefaultAlipayClient(AliRefundConfig.request_url,AliRefundConfig.app_id,AliRefundConfig.private_key,"json","GBK",AliRefundConfig.ali_public_key,"RSA");
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
AlipayRefundInfo alidata= new AlipayRefundInfo();//这里我封装了一个类用来传递json数据
alidata.setOut_trade_no(out_trade_no);
alidata.setRefund_amount(refund_amount);
alidata.setTrade_no(trade_no);
request.setBizContent(JsonUtil.toJSONString(alidata));//将数据格式化成json格式
AlipayTradeRefundResponse response;
response = alipayClient.execute(request);
if ("10000".equals(response.getCode())) {
System.out.println("退款成功");//没有提示消息就是好消息strResponse=null
}else {
strResponse=response.getSubMsg();//退款失败的提示信息
}
} catch (Exception e) {
e.printStackTrace();
}
return strResponse;
}
本以为写到这里应该就没问题了,开始测试,测试的时候只需要请求一个action,然后action中调用此工具类里的这个方法就行了。(切记:一定要先下单。测试下一个0.01元的订单,然后得到该订单的out_trade_no和(trade_no,refund_amount:0.01 这几个测试的时候可以直接写死)
这个是我的boss后台,我的程序是这样的,在这里点击确认退款后,就调用我上面写的方法
结果后台还是出问题了(抛异常:sign无效, 也有的是app_id无效等等)
看到这些问题的时候,不要慌,因为这个很可能不是你程序写的问题。(我之前支付用的是MD5加密的,而本次用的是RSA加密)
这里的数据一定要是和公司支付宝账号的信息完全对应,想到这里果断联系上级领导,要到了公司支付宝的账号和密码
登录成功后,我们找到了app_id
在公司logo头像下找到“账号管理”
点进去,看看是否设置了RSA秘钥,且要确保和你在程序中的配置的一模一样
对应的私钥如果忘记的话,要重新生成公钥并上传,私钥一定要记住并放到你的程序中
(生成RSA公钥和私钥工具)这个可以直接在支付宝开放平台上下载就好了
用这个动动生成你需要的公钥和私钥,公钥要上传到上面说的那个支付宝的开放平台上。对于java开发人员的话,要特别注意
生成的这个文件才是你要的私钥哦。(这里有个插曲,上传公钥的时候,需要老板将收到的短信验证码给到你……)
私钥和公钥是一对,切记,你上传到支付宝开放平台上的那个公钥对应的私钥如果忘记了,那你就要用工具重新再生成一对公钥和私钥了,还要再问老板要验证码重新上传新的公钥……甚是麻烦
OK,现在,就没问题了。
测试效果如下