java 支付宝 退款_Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)

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

然后创建应用选择需要接入的功能,有些应用是需要签约的签约就好了审核蛮快的.

7fa011927528888ee617fadbc2f6b594.png

以上应用申请,功能申请的一些操作我就不多做解释了网上很多例子,

Java支付宝支付

这里有APP支付和手机网站支付, APP支付是针对Android和IOS的案例,  那么我做的是手机网站支付针对Java后台的案例.71e1c3226fcb3eddedafb26deb3f50d7.png

我直接贴我的代码:

/**

*

* 说明:支付宝支付 (我只填了部分参数,如果有更多参数需求的 可以直接: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异步通知代码

/**

*

* 说明:对于手机网站支付产生的交易,支付宝会根据原始支付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 params = new HashMap();

Map requestParams = request.getParameterMap();

for (Iterator 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 params = new HashMap();

Map requestParams = request.getParameterMap();

for (Iterator 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;

}

}

今天就先写到 支付宝支付,明天再写支付宝退款及其他操作.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DB排行榜更新,.NET Core+MySQL成主流!

上图是DB-Engines数据库流行度最新排行榜&#xff0c;Oracle、MySQL、SQLServer虽几经下滑&#xff0c;然而还是遥遥领先的前三名。后起之秀PostgreSQL和MongoDB持续增长&#xff0c;然而在体量上还相差甚远&#xff0c;可以预见这些年&#xff0c;三大关系型数据库的主流地位是…

史上最惨锦鲤即将来袭!奖品堪比5年高考3年模拟!

全世界只有3.14 % 的人关注了数据与算法之美在锦鲤盛行的2018年我们超级数学建模也跟风来了一个“史上最惨锦鲤”活动为什么叫史上最惨锦鲤呢因为平常看一本数学书就已经头疼了何况我们奖品还是100本数学书试问除了学霸还有谁能承受这种殊荣巧的是最后的得主还真是一个学霸那就…

人工智能读心术

全世界只有3.14 % 的人关注了数据与算法之美对于许多无法发出声音的人来说&#xff0c;他们想说的话会通过某种信号隐藏在大脑中。人类无法直接破译这些信号。但是&#xff0c;最近有三个研究小组在“破译”这种大脑语言密码上取得了一定进展。Science杂志最新报道了哥伦比亚大…

今日港股期货(港股期货今日交易动向)

港股期货收涨0.6% 首次突破31000点 今日港股期货大涨&#xff0c;形势一时看好。其中&#xff0c;恒生指数期货一度突破31000点关口&#xff0c;创出历史新高。分析人士表示&#xff0c;市场情绪积极&#xff0c;投资者对于全球经济复苏前景和中国经济增长的预期不断提高&…

春节特惠活动┃一张纸一幅图,竟然提高了10倍的学习和工作效率!?

▲数据汪特别推荐点击上图进入玩酷屋人类大脑的容量远远超出一般人的想象&#xff0c;时到21世纪的今天&#xff0c;我们对大脑的运用远远不够。大脑机能的使用率基于我们的思维模式&#xff0c;而思维导图正是开发大脑中最有效的利器&#xff01;之前小木给大家推荐了一套基于…

java class文件 代码_java_基础——用代码编译.java文件+加载class文件

java_基础——用代码编译.java文件加载class文件java_基础——用代码编译.java文件加载class文件【简单编译的流程】package com.zjm.www.test;import java.io.IOException;import javax.tools.JavaCompiler;import javax.tools.JavaCompiler.CompilationTask;import javax.too…

WPF 记一个Popup踩坑记录

看名字就知道&#xff0c;它是一个弹出控件&#xff0c;顾名思义&#xff0c;我们可以用它来实现类似Combobox那种&#xff0c;点击后弹出下面选项列表的操作。记录&#xff1a;需求&#xff1a;有一个文本框 &#xff0c;鼠标点击后&#xff0c;弹出一个Popup。我编写了以下xa…

通过电话号码获取姓名 (+86或者飞信)

2019独角兽企业重金招聘Python工程师标准>>> /** * 通过电话号码获取姓名 (86或者飞信) */ /* public String getContactName(String phoneNum) { String contactName "";// 处理电话号码格式问题 if (phoneNum.length() > 11) {ContentResolver cr …

春节特惠活动┃强烈推荐!孩子的科普从这套全球畅销250万册的最酷科学书起步...

▲数据汪特别推荐点击上图进入玩酷屋在马斯的学生时代的记忆中&#xff0c;数学定义定理、化学方程式、物理公式……这些科学知识点总是冷冰冰的&#xff0c;枯燥、深奥也总是科学的代名词。如今教育局明确规定科学课是小学必修课&#xff0c;孩子也逐步接受科学知识的熏陶。但…

删除未使用的引用 | Visual Studio 2019(16.10)新功能试用

当解决方案很小时&#xff0c;我们清楚地知道解决方案中使用了哪些项目引用和NuGet包&#xff0c;要想清理它们很容易。而对于大型的解决方案&#xff0c;有哪些包在使用中&#xff0c;开发人员很难找到它们&#xff0c;或者找起来可能很耗时。Visual Studio 2019(16.10)添加了…

女生转行IT与男生有什么不一样?

全世界只有3.14 % 的人关注了数据与算法之美在我的后台咨询者当中&#xff0c;女生向我咨询最多的问题就是&#xff1a;女生转行IT有什么困难&#xff1f;是不是很多IT企业都不要女生啊&#xff1f;女生的逻辑不如男生&#xff0c;是不是学不好编程&#xff1f;等等。1以上的所…

Blazor 基础入门

Blazor 基础知识IntroBlazor 是微软在 .NET 里推出的一个 WEB 客户端 UI 交互的框架&#xff0c;使用 Blazor 你可以代替 JavaScript 来实现自己的页面交互逻辑&#xff0c;可以很大程度上进行 C# 代码的复用&#xff0c;Blazor 对于 .NET 开发人员来说是一个不错的选择。托管模…

java 列表展开方式_android列表控件实现展开、收缩功能

最近在做一个Rss阅读器&#xff0c;我看了一看别人做的阅读器中的lisView可以伸缩&#xff0c;展开&#xff0c;我就在网上搜索了一下。果然让我找到&#xff0c;下面就我找到的一个小例子&#xff0c;给大家分享一下。ActivityMain .javapackage com.android;import android.a…

每个人都应该学习编程,因为它会教你如何思考

▲数据汪特别推荐点击上图进入玩酷屋扎克伯格11岁开始学习编程&#xff0c;创办Facebook&#xff1b;比尔盖茨13岁学习编程&#xff0c;创办微软……乔布斯说&#xff1a;“每一个人都应该学习电脑编程&#xff0c;因为它会教你如何思考。"现在在北京上海&#xff0c;顶级…

.NET Core HttpClient请求异常思考

【导读】上一篇我们讨论了针对项目上异常信息的具体分析而给出对应解决方案&#xff0c;本篇仅是我个人对相关异常信息了解过后的进一步学习和思考&#xff0c;希望对后续遇到此异常信息的同学们给予思路扩展下面我们结合如下两个异常信息进行大致排查分析&#xff0c;到底什么…

程序员编程10大原则,请牢牢记住!

全世界只有3.14 % 的人关注了数据与算法之美1、想清楚&#xff0c;再动手写代码刚入行的新手&#xff0c;为了展示自己的能力&#xff0c;拿到需求迫不及待地就开始上手写代码&#xff0c;大忌&#xff01;2、不交流&#xff0c;就会头破血流不爱说话和沟通&#xff0c;需求都理…

技术分享|基于SQL Server Change Tracking实现宽表的增量更新

源宝导读&#xff1a;在企业建设信息化的过程中&#xff0c;客户通常会使用一些数仓工具来构建数据资产&#xff0c;随着用户的要求越来越高&#xff0c;传统的ETL技术已经无法满足客户的实时性诉求&#xff0c;本文将分享“天际-数据平台”如何基于SQL Server来实现数仓数据的…

C# 文件操作详解(一)---------File类

C#对文件的操作相当方便&#xff0c;主要涉及到四个类&#xff1a;File、FileInfo、Directory、DirectoryInfo&#xff0c;前两个提供了针对文件的操作&#xff0c;后两个提供了针对目录的操作&#xff0c;类图关系如下&#xff1a; 图1&#xff1a;类图 下面通过实例来看下每个…

小时“数感”好,长大才能数学好

▲数据汪特别推荐点击上图进入玩酷屋很多妈妈都无比担心孩子的数学&#xff1a;孩子会不会像自己一样重蹈覆辙呢&#xff1f;在很多人眼里&#xff0c;数学是一堆怎么也弄不明白的公式、符号&#xff0c;而且是怎么努力怎么用功死活就是学不好的一门学科。可是&#xff0c;同样…

java并行流 阻塞主线程_多线程入门案例与java8的并行流

java8 实例请移步https://www.cnblogs.com/ngLee/p/14021859.html进程与线程进程是所有线程的集合&#xff0c;每一个线程是进程中的一条执行路径。多线程的创建方式&#xff0c;继承Thread\实现Runable/*** 第一种创建线程的方式&#xff0c;继承Thread*/public class MultiTh…