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 ArLen
- * @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
- /**
- *
- * 说明:对于手机网站支付产生的交易,支付宝会根据原始支付API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果作为参数通知到商户系统。
- * @param request
- * @return
- * @author Arlen
- * @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 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)的更多相关文章
- Java 支付宝支付,退款,单笔转账到支付宝账户(单笔转账到支付宝账户)
上次分享了支付宝订单退款的代码,今天分享一下支付宝转账的操作. 现在是有一个余额提现的功能,本来是打算做提现到银行卡的,但是客户嫌麻烦不想注册银联的开放平台账户,就说先提现到支付宝就行,二期再做银行 ...
- Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝订单退款)
上一篇写到支付宝的支付,这代码copy下来就能直接用了, 我写学习文档时会经常贴 官方参数文档的案例地址, 因为我觉得 请求参数,响应参数说明 官方文档整理的很好,毕竟官方不会误导大家. 我学一个 ...
- 如何使用沙箱测试单笔转账到支付宝账号(php版) https://openclub.alipay.com/read.php?tid=1770&fid=28
说明: 本帖是利用支付宝沙箱测试电脑网站支付接口 测试环境:Apache2.4.23 +php 5.6.25 沙箱环境测试正式环境请修改网关为下方值 复制代码 1 正式环境网关:htt ...
- Laravel 开发支付宝支付与提现转账问题小结
由于项目需要,所以需要开发支付宝支付与微信支付,支付部分采用了 yansongda/pay https://packagist.org/packages/yansongda/pay https ...
- Python支付宝单笔转账接口
开发信息 接口加签方式为证书模式 证书模式好处是可以使用支付宝的转账到支付宝账户,也就是提现功能,公钥模式不能实现转账到支付宝账户. 此DEMO利用单笔转账到支付宝账户接口[提现功能]用户可以通过此D ...
- asp.net mvc 接入最新支付宝支付+退款 alipay-sdk-NET-20170615110549
第1步: https://openhome.alipay.com/developmentDocument.htm 第2步:下载sdk和demo https://docs.open.alipay.com ...
- Java springboot支付宝小程序授权,获取用户信息,支付及回调
参考官方文档https://opendocs.alipay.com/mini/introduce/pay 支付宝小程序的支付和微信小程序的支付一样第一步都是要获取到用户的唯一标识,在微信中我们获取到的 ...
- 基于xposed逆向微信、支付宝、云闪付来实现个人免签支付功能
我的个人网站如何实现支付功能? 想必很多程序员都有过想开发一个自己的网站来获得一些额外的收入,但做这件事会遇到支付这个问题.目前个人网站通过常规手法是无法实现支付管理的,所有支付渠道都需要以公司的身份 ...
- asp 支付宝 企业版 接口 支持网银接口 ,网银直接支付
asp 支付宝 企业版 接口 支持网银接口 ,网银直接支付 仅仅是多了一个defalutbank的參数. 详细看 open.alipay.com <% ' 类名:AlipaySubmit ' 功 ...
随机推荐
- 03-jQuery动画效果
Query提供的一组网页中常见的动画效果,这些动画是标准的.有规律的效果:同时还提供给我们了自定义动画的功能. 显示动画 方式一: $("div").show(); 解释:无参数, ...
- pb数据导出
pb数据导出(一) 1.在窗口新建用户事件 ue_export 2.事件调用函数 gf_dw_to_excel(THIS.dw_dict) 3.写函数 :boolean lb_setborde ...
- 【接口时序】8、DDR3驱动原理与FPGA实现(一、DDR的基本原理)
一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:无 3.仿真工具:无 硬件平台: 1. FPGA型号:无 2. DDR3型号:无 二. 存储器的分类 存储器一 ...
- Bootstrap框架的基本使用
Bootstrap是什么 简介 就是已经写好的一个html和css的样式组合 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应 ...
- Redis 学习笔记(十二)Redis 复制功能详解 ----- (error) READONLY You can't write against a read only slave
Redis 复制(Replication)1. 复制介绍分布式数据库为了获取更大的存储容量和更高的并发访问量,会将原来集中式数据库中的数据分散存储到多个通过网络连接的数据存储节点上.Redis为了解决 ...
- Ehcache3开发入门简介
在高并发应用中缓存就是核心机制.最近在研究Ehcache,发现这是一个更加灵活易用的缓存框架(相对于Redis.Memcache),Ehcache更加小巧轻便.而且都有持久化机制,不用担心JVM和服务 ...
- HDU 6020---MG loves apple(枚举)
题目链接 Problem Description MG is a rich boy. He has n apples, each has a value of V(0<=V<=9). A ...
- list源码3(参考STL源码--侯捷):push_front、push_back、erase、pop_front、pop_back、clear、remove、unique
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...
- Android生成自定义二维码
前面说过两种二维码扫描方式,现在说如何生成自定义酷炫二维码.二维码生成需要使用Google开源库Zxing,Zxing的项目地址:https://github.com/ZBar/ZBar,我们只需要里 ...
- 大叔力量VIP介绍
VIP介绍 框架技术点 平台 仓储 日志收集 缓存 消息队列 服务总线 事务 任务调度 授权 模块化 服务发现 .net ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ - .net core ✔ ✔ ✔ ✔ ✔ ...