Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)
程序员文章站
2022-05-01 16:53:55
最近一直在接触第三方,刚接入完支付宝的API做一下总结,个人能力薄弱有不对的地方望指教. 做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档. 进入主题, 支付宝支付先要去 蚂蚁金服开放平台注册账号:https://open.alipay.com/platf ......
最近一直在接触第三方,刚接入完支付宝的api做一下总结,个人能力薄弱有不对的地方望指教. 做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档.
进入主题, 支付宝支付先要去 蚂蚁金服开放平台注册账号:
然后创建应用选择需要接入的功能,有些应用是需要签约的签约就好了审核蛮快的.
以上应用申请,功能申请的一些操作我就不多做解释了网上很多例子,
java支付宝支付
这里有app支付和手机网站支付, app支付是针对android和ios的案例, 那么我做的是手机网站支付针对java后台的案例.
这里直达官方文档:
我直接贴我的代码:
/**
*
* 说明:支付宝支付 (我只填了部分参数,如果有更多参数需求的 可以直接:https://docs.open.alipay.com/203/107090/ )
* @param ordernumber 商户网站唯一订单号
* @param ordermoney 订单金额
* @param ordersubject 商品的标题,关键字
* @param notifyurl 异步回调地址(后台) 获取订单信息
* @param returnurl 同步回调地址(app) 处理业务及渲染页面
* @author 许奥伦
* @time:2018年12月11日 下午2:14:57
*/
@override
public void payment(string ordernumber,
string ordermoney,
string ordersubject,
string notifyurl,
string returnurl) {
//填写自己创建的app的对应参数
private static alipayclient alipayclient = new defaultalipayclient("支付宝网关", "appid", "私钥", "json", "utf-8", "公钥","rsa2");
alipaytradewappayrequest alipayrequest = new alipaytradewappayrequest();
// 封装请求支付信息
alipaytradewappaymodel model=new alipaytradewappaymodel();
model.setouttradeno(ordernumber);
model.settotalamount(ordermoney);
model.setsubject(ordersubject);
model.setproductcode("quick_wap_way");
alipayrequest.setbizmodel(model);
//异步回调地址(后台)
alipayrequest.setnotifyurl(notifyurl);
// 同步回调地址(app)
alipayrequest.setreturnurl(returnurl);
try {
//调用sdk生成表单
string form = alipayclient.pageexecute(alipayrequest).getbody();
//打印, 可以直接response到页面上
system.out.println(form);
} catch (alipayapiexception e) {
e.printstacktrace();
}
}
支付成功后支付宝会自动请求你写的 notifyurl (异步通知, 接收支付宝异步通知,从而获取此订单的状态) 和 returnurl (支付完成后,支付宝会发送同步请求进行数据渲染, 这里我是用modelandview 渲染的数据)
notifyurl异步通知代码
异步响应数据官方文档:
公共响应参数 :
/**
*
* 说明:个人理解: 异步通知消息, 在支付完成之后支付宝会每隔一段时间来发送一次请求,直到返回success才会停止
* @param request
* @return
* @author 许奥伦
* @time:2018年12月3日 下午4:51:35
*/
@requestmapping("notifyurl")
@responsebody
public string notify(httpservletrequest request){
int im=0;
im++;
//测试请求次数
system.out.println("次数:"+im);
//获取支付宝post过来反馈信息
map<string,string> params = new hashmap<string,string>();
map<string, string[]> requestparams = request.getparametermap();
for (iterator<string> iter = requestparams.keyset().iterator(); iter.hasnext();) {
string name = (string) iter.next();
string[] values = (string[]) requestparams.get(name);
string valuestr = "";
for (int i = 0; i < values.length; i++) {
valuestr = (i == values.length - 1) ? valuestr + values[i]
: valuestr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
//valuestr = new string(valuestr.getbytes("iso-8859-1"), "gbk");
params.put(name, valuestr);
}
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
//商户订单号
string out_trade_no = request.getparameter("out_trade_no");
//支付宝交易号
string trade_no = request.getparameter("trade_no");
//交易状态
string trade_status = request.getparameter("trade_status");
system.out.println(trade_status);
try {
boolean verify_result = alipaysignature.rsacheckv1(params, alipay_public_key, "utf-8", "rsa2");
if(verify_result){
//验证成功
//请在这里加上商户的业务逻辑程序代码
system.out.println("returnurl_params:验证成功");
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
boolean flg = false;
if(trade_status.equals("trade_finished")){
system.out.println("returnurl_params:交易结束");
//交易结束,不可退款
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
} else if (trade_status.equals("trade_success")){
//交易支付成功
//注意:
//付款完成后,支付宝系统发送该交易状态通知
//根据订单号将订单状态和支付宝记录表中状态都改为已支付
system.out.println("returnurl_params:交易支付成功");
flg = true;
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
if(flg){
return "success";
}else{
return "fail";
}
}else{//验证失败
//out.print("fail");
return "fail";
}
} catch (alipayapiexception e) {
e.printstacktrace();
return "500";
}
}
returnurl 同步通知代码
我在这边处理了业务逻辑,还在测试阶段, 我觉得有些欠缺.
@requestmapping("/returnurl")
public modelandview result( httpservletrequest request) {
system.out.println("进来");
//用modelandview 进行数据渲染
modelandview mv = new modelandview("alipay/return_url");
//获取支付宝get过来反馈信息
map<string,string> params = new hashmap<string,string>();
map<string, string[]> requestparams = request.getparametermap();
for (iterator<string> iter = requestparams.keyset().iterator(); iter.hasnext();) {
string name = (string) iter.next();
string[] values = (string[]) requestparams.get(name);
string valuestr = "";
for (int i = 0; i < values.length; i++) {
valuestr = (i == values.length - 1) ? valuestr + values[i]
: valuestr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
// valuestr = new string(valuestr.getbytes("iso-8859-1"), "utf-8");
params.put(name, valuestr);
}
//交易订单编号
string out_trade_no = request.getparameter("out_trade_no");
//交易金额
string total_amount = request.getparameter("total_amount");
//支付宝交易账号
//string trade_no = request.getparameter("trade_no");
//订单创建时间
string timestamp = request.getparameter("timestamp");
mv.addobject("out_trade_no", out_trade_no);
mv.addobject("total_amount", total_amount);
mv.addobject("timestamp", timestamp);
//打印所有响应数据
system.out.println("returnurl_params:"+params);
try {
boolean verify_result = alipaysignature.rsacheckv1(params, alipay_public_key, "utf-8", "rsa2");
if(verify_result){
//验证成功 这里写的是假代码
//系统处理根据支付宝回调更改订单状态或者其他关联表的数据 (走业务流程, 根据订单编号获取订单数据
//order order =orderservice.queryorderbynumber(out_trade_no);
/* if(order !=null){
//order不为null
mv.addobject("verify_result", verify_result);
mv.addobject("msg", "商户订单号不存在");
} */
return mv;
}else{
//验证失败 跳失败页面
system.out.println("验证失败");
return null;
}
} catch (alipayapiexception e) {
e.printstacktrace();
//出现异常 跳失败页面
return null;
}
}
今天就先写到 支付宝支付,明天再写支付宝退款及其他操作.