Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)相关的知识,希望对你有一定的参考价值。
最近一直在接触第三方,刚接入完支付宝的API做一下总结,个人能力薄弱有不对的地方望指教. 做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档.
进入主题, 支付宝支付先要去 蚂蚁金服开放平台注册账号:https://open.alipay.com/platform/home.htm
然后创建应用选择需要接入的功能,有些应用是需要签约的签约就好了审核蛮快的.
以上应用申请,功能申请的一些操作我就不多做解释了网上很多例子,
Java支付宝支付
这里有APP支付和手机网站支付, APP支付是针对android和ios的案例, 那么我做的是手机网站支付针对Java后台的案例.
这里直达官方文档:https://docs.open.alipay.com/203/105285/
我直接贴我的代码:
/** * * 说明:支付宝支付 (我只填了部分参数,如果有更多参数需求的 可以直接: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异步通知代码
异步响应数据官方文档: https://docs.open.alipay.com/203/105286/
公共响应参数 : https://docs.open.alipay.com/api_1/alipay.trade.wap.pay
/** * * 说明:个人理解: 异步通知消息, 在支付完成之后支付宝会每隔一段时间来发送一次请求,直到返回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; } }
今天就先写到 支付宝支付,明天再写支付宝退款及其他操作.
以上是关于Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)的主要内容,如果未能解决你的问题,请参考以下文章