Java SpringMVC 支付宝-手机网站支付接口

news/2024/5/20 14:52:34/文章来源:https://blog.csdn.net/javaQQ561487941/article/details/87974038

首先就是申请支付宝第三方接口,获取到APPID,应用发布前也可以用支付宝的沙箱环境,服务器要开启外网访问权限,因为支付宝需要返回异步通知(notify_url)和同步通知(return_url)

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

支付宝最近推出的支付宝接口2.0,网上有很多教程都是之前版本的,但支付宝给出了兼容方案

第三方支付原理

以上简要说明了支付过程,当然其中省略了一些步骤(比如购物车,订单等),我们重点来看支付流程。

2.1用户向商城网站发起确认订单的请求

2.2商城网站接收到请求保存订单数据到数据库或其他存储介质

2.3返回订单确认页面,页面上应该显示订单金额等信息

2.4用户确认支付,发起支付请求。注:支付请求是发送到支付网关(比如支付宝、网银在线)而不是发送到商城网站。

2.5显示支付页面

2.6用户填写认证信息(账号密码等)提交

2.7这里有两个步骤一个是扣款成功后页面跳转到支付结果页面(展示给用户),另一个是支付通知,这两步没有先后顺序可能同时执行,商城网站接收到支付通知后根据验证规则验证信息的有效性,并作出相应的更改操作(例:有效则更改订单为已付款状态,无效则记录非法请求信息)。

以支付宝为例:如果实现在网站中集成支付宝接口,首先要有一个支付宝账号,接下来向支付宝申请在线支付业务,签署协议。协议生效后有支付宝一方会给网站方一个合作伙伴ID,和安全校验码,有了这两样东西就可以按照支付宝接口文档开发支付宝接口了,在上图的几个步骤中只有4和7两个步骤在商城与支付网关之间有信息交互。在步骤4中指将数据发送到支付网关(支付宝),在步骤7中是的通知验证部分,验证网关请求网站某地址,网站按验证规则对信息进行验证记录并作出响应

(1).第一步要先能够跳转到支付宝的支付界面(可以本地测试)。

(2).第二部完成支付跳转回商家界面(必须线上测试,因为返回回来,支付宝找不到你的localhost:8080;所以必须要有域名(地址))。

支付宝开放平台下载demo和SDK(Java版本),然后根据自己所需要,拷贝进它的源代码,也可以全部拷入,但是不一定都用得到。

数据交互方式可以用jsp,也可以用控制器。支付宝给的demo是用的jsp实现。

首先导入支付宝的两个jar包:

但是感觉用控制器(Controller)更好做一些:alipay-sdk-java20170307171631.jar;commons-logging-1.1.1.jar

代码:

配置参数

package com.alipay.config;public class AlipayConfig {// 商户appid这是从支付宝开放平台获取的APPIDpublic static String APPID = "";// 私钥 pkcs8格式的public static String RSA_PRIVATE_KEY = "";// 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String notify_url = "http://www.****.cn/PayTest/notify_url";// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址public static String return_url = "http://www.****.cn/PayTest/return_url";// 请求网关地址public static String URL = "https://openapi.alipay.com/gateway.do";// 编码public static String CHARSET = "UTF-8";// 返回格式public static String FORMAT = "json";// 支付宝公钥public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoUg6+XycCWdQRp2qpHN5b8mw1+juv4dbcYFA61dVivDHH2sqdcL2EFfFO1Msa66T9IeFqJFyod8bVmG8vF3iql12zpceY+eHEZHmkxCBqlivLTJIfChkDmiBlARlnsZ8vK8A01VvlNdgq3g/o6+OzY/frei5bVcMVyIFBjg0fdV9vzOzb4CrQn390JLJ80aA8o5TsvlCeUHg4zAMDUyOm2suAuvgiqekEVS/qvRO+I2O1GTp3dJjPNsdmRVxNsxoU8DEApMLNYmxHiWZpFhRxRdH54ugHWkNmFGyT5y/S1g7dq/nfVgriycZ3BoKtoG4eep7cpK1rnRk+aEpLm9FmQIDAQAB";// 日志记录目录public static String log_path = "/log";// RSA2public static String SIGNTYPE = "RSA2";
}

支付

if(request.getParameter("WIDout_trade_no")!=null){// 商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");// 订单名称,必填//String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8");String subject = request.getParameter("WIDsubject");//System.out.println(subject);// 付款金额,必填String total_amount=new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8");// 商品描述,可空String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8");// 超时时间 可空String timeout_express="2m";// 销售产品码 必填String product_code="QUICK_WAP_PAY";/**********************/// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签 //调用RSA签名方式AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();// 封装请求支付信息AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();model.setOutTradeNo(out_trade_no);model.setSubject(subject);model.setTotalAmount(total_amount);model.setBody(body);model.setTimeoutExpress(timeout_express);model.setProductCode(product_code);alipay_request.setBizModel(model);// 设置异步通知地址alipay_request.setNotifyUrl(AlipayConfig.notify_url);// 设置同步地址alipay_request.setReturnUrl(AlipayConfig.return_url); // form表单生产String form = "";try {// 调用SDK生成表单form = client.pageExecute(alipay_request).getBody();response.setContentType("text/html;charset=" + AlipayConfig.CHARSET); response.getWriter().write(form);//直接将完整的表单html输出到页面 response.getWriter().flush(); response.getWriter().close();} catch (AlipayApiException e) {// TODO Auto-generated catch blocke.printStackTrace();} 
}
Controller

异步通知处理支付宝会以json格式返回相应参数

支付状态trade_status的值有四种

 

Java SpringMVC 支付宝-手机网站支付接口

 

 

 

@RequestMapping(value="notify_url")public String notify_url(HttpServletRequest request,HttpServletResponse response) throws AlipayApiException{Map<String,String> params = new HashMap<String,String>();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");//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)////计算得出通知验证结果//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);if(verify_result){//验证成功////请在这里加上商户的业务逻辑程序代码//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——if(trade_status.equals("TRADE_FINISHED")){//判断该笔订单是否在商户网站中已经做过处理//注意://如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知//如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。} else if (trade_status.equals("TRADE_SUCCESS")){//判断该笔订单是否在商户网站中已经做过处理service.updatePayStatus(out_trade_no);//注意://如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。}//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——System.out.println("success");	//请不要修改或删除}else{//验证失败System.out.println("fail");}return trade_status;}

理论上异步方法要快于同步方法,因为中间还有一个跳转流程。所以如果要将支付宝返回来的信息存入数据库,逻辑一般是写在异步方法里面,同步方法只作为页面跳转(支付完成后的跳转)一般不需要验签。如果把逻辑写在同步方法里面,客户在支付成功直接关闭窗口,活动会被关闭,就访问不到控制器了。

而异步方法访问的方法是要在浏览器上直接访问到的!但是一般我们网站都做了权限过滤的,要先去判断是否登录,没登录一般跳转登录界面。但是不论你是用的过滤器还是 shiro,还是其它的,总之你要暴露出这个方法要让支付宝能访问!

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

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

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

相关文章

JAVA WEB快速编写一个JSP WEB网站了解网站的基本结构 调试 部署

一、使用eclipse初始化一个JSP WEB项目(即&#xff1a;动态WEB项目)&#xff0c;步骤如下&#xff1a; 如上图示注意选择TOMCAT版本 如上图示勾选生成web.xml&#xff0c;当然如果不勾选也行&#xff0c;但后续如果有需要用到配置的地方就需要再单独添加&#xff0c;故这里我选…

我穿越到1994年,终于发现80%的网站都用PHP的原因!

见字如面&#xff0c;我是军哥&#xff01;昨天晚上写代码到深夜&#xff0c;一头扎到床上&#xff0c;沉沉睡去。第二天睁开眼睛&#xff0c;我发现自己居然坐在一个咖啡馆里&#xff0c;旁边的墙上贴着最新的英文电影海报《阿甘正传》、《肖申克的救赎》这都是1994年的经典电…

Java程序员进阶笔记实操—大型网站架构技术之负载均衡详解(3)

欢迎关注专栏&#xff1a;Java架构技术进阶。里面有大量batj面试题集锦&#xff0c;还有各种技术分享&#xff0c;如有好文章也欢迎投稿哦。 上一篇&#xff1a;Java程序员进阶笔记实操—大型网站架构技术之负载均衡详解&#xff08;2&#xff09; 本次分享大纲 软件负载均衡概…

使用SEP实现:禁止访问特定的网站

利用SEP自带的防火墙可以禁止客户所需要禁止的网站。具体操作如下&#xff1a; 1、点击【Policies】选【Firewall】&#xff0c;在右边右击&#xff0c;选择【Add】。 2、选择【Rules】&#xff0c;可以再【Policy name】里更改名字&#xff0c;便于识别。 3、选择【Add Rule】…

允许网站使用相机和麦克风_新一代网红神器 佳能G7 X Mark III相机评测

1英寸卡片机向来是很多玩家首选的随身摄影器材。一方面&#xff0c;1英寸传感器相较手机等常规装备而言具备更高的成像水准&#xff1b;另一方面&#xff0c;“小巧机身大光圈变焦镜头”的配置不仅带来了出色的便携性&#xff0c;同时还能满足各种复杂的拍摄需求&#xff0c;实…

怎么arm数据上传到云服务器_纵横数据:在日本服务器上搭建外贸网站怎么样?...

​​现在外贸建站赚取外汇已经成为不少企业的收入来源&#xff0c;而对于外贸网站的搭建&#xff0c;不少企业或者网站开发者都会选择使用wordpress程序&#xff0c;而且近几年采用wordpress搭建外贸用户的增长一直都比较快。那么使用wordpress搭建外贸网站有什么好处&#xff…

Magento网站迁移指南

上周五&#xff0c;为MKT同事迁移了一个从本机到GODADDY的MAGENTO系统。 中间出了不少状况&#xff0c; 现在写个迁移纲要&#xff1a; ~~~~~~~~~~~~~~~~ 1&#xff0c;网页和数据库文件上传&#xff0c;最好采用压缩方式&#xff0c;节约网络流量和布置时间。 2&#xff0c;如…

网站php.ini在哪,php.ini在哪

最近在centos中安装lamp环境&#xff0c;发现装完php之后&#xff0c;没有php.ini文件&#xff0c;那么php.ini在哪呢&#xff1f;正常情况下php.ini文件是在php的安装目录下的lib目录里&#xff0c;比如我的php安装目录在/usr/local/php/中,而我进到/usr/local/php/lib目录中却…

总用这个网站把ppt,doc转成PDF,还挺好用,记一下

2019独角兽企业重金招聘Python工程师标准>>> http://www.freepdfconvert.com/ 转载于:https://my.oschina.net/ahuaahua/blog/132714

10个帮程序员和站长减压放松的良心网站!

2019独角兽企业重金招聘Python工程师标准>>> 1. Calm 这是同类型中最火的网站了&#xff0c;站如其名&#xff0c;「平和」&#xff0c;通过自然的图像&#xff08;阳光下的暖流、淙淙的小溪等&#xff09;与缓缓的音乐&#xff0c;帮你在短时间内放松下来。 左侧有…

php网站栏目隐藏,phpcms 首页需要隐藏栏目的代码

找到首页模板搜索{php $num}在其后面增加代码即可{php if($r[ismenu]!1) continue;}完成代码如下{loop subcat(0,0,0,$siteid) $r}{php $num}{php if($r[ismenu]!1) continue;}{$r[catname]}更多>>{pc:content action"lists" catid"$r[catid]" order…

ie连接服务器被系统禁止,防止IE被流氓网站乱改

随着互联网的普及和网民队伍的壮大&#xff0c;网络也变的越来不安全。病毒、木马日益侵蚀着我们的网络&#xff0c;让我们感到网络上到处都存在着危险。尽管FireFox、Maxthon等的浏览器以其独特的功能和安全性被越来越多的用户接受&#xff0c;但是IE仍然是浏览器中的“老大”…

JSP网站开发基础总结《一》

经过JAVASE的学习相信大家对JAVA已经不再陌生&#xff0c;那么JAVA都可以干什么呢&#xff1f;做算法、应用程序、网站开发都可以&#xff0c;从今天开始为大家奉上JAVAEE之JSP动态网站开发基础总结。 既然是动态网站开发&#xff0c;那它与传统的静态网站有什么区别呢&#xf…

css3媒体查询实现网站响应式布局

响应式建筑设计、响应式家具设计、响应式办公设计&#xff0c;这些词可能是已有的专业名词&#xff0c;也可能是我自己想出来的一些名词。因为在生活中&#xff0c;我们常常会见到很多让人惊叹的设计&#xff0c;为什么同一套东西经过不同的方式变化之后会给人不同的使用感受和…

ubuntu下webbench作网站压力测试教程【webbench安装】

webbench最多可以模拟3万个并发连接去测试网站的负载能力&#xff0c;个人感觉要比Apache自带的ab压力测试工具好&#xff0c;安装使用也特别方便。 1. 安装教程 1.1 安装依赖 exuberant-ctags sudo apt-get install exuberant-ctags1.2 下载源码并安装 wget http://blog.s…

考试网站暂时关闭_高权重网站站长之家,站长专栏申请暂时关闭了!

站长之家&#xff0c;站长专栏申请暂时关闭了&#xff0c;做SEO的朋友应该知道站长之家是可以免费投稿的&#xff0c;且发布内容是可以带外链。不论是从SEO角度发布外链&#xff0c;还是软文推广方面来看&#xff0c;站长之家确实是非常不错的一个外链推广平台&#xff0c;近日…

php视频网毕业论文范文,毕业设计论文-基于PHP的精品课程网站的设计与实现.doc...

毕业设计论文-基于PHP的精品课程网站的设计与实现.doc还剩41页未读&#xff0c;继续阅读下载文档到电脑&#xff0c;马上远离加班熬夜&#xff01;亲&#xff0c;很抱歉&#xff0c;此页已超出免费预览范围啦&#xff01;如果喜欢就下载吧&#xff0c;价低环保&#xff01;内容…

网站重定向次数过多怎么解决_网站关键词排名怎么查询,网站排名差怎么解决?...

网站关键词的的排名可以为企业带来流量和客户&#xff0c;网站运营人员也为提升网站排名为工作的目标。那么在做网站排名的时候网站关键词排名是怎么查询的呢&#xff1f;网站排名差怎么解决&#xff1f;  一、查询网站排名的方法:1、手动查询我们可以在百度上搜索我们想要查…

我的第一个响应式网站zz

一些废话&#xff08;马克思主义乖巧&#xff09; 上班快四个月了&#xff0c;码了一堆无聊的页面&#xff0c;终于&#xff0c;来了一次好玩点的&#xff0c;要我做个响应式网站。正好之前有在看Bootstrap。只是光学习不练的话效率比较慢&#xff08;有跟着写demo&#xff09;…

网站开发流程以及HTML5简介(十三)

2019独角兽企业重金招聘Python工程师标准>>> HTML代码编辑工具 ExHtmlEditorExHtmlEditor是一个用于学习和编写HMTL的工具。在你边写代码时&#xff0c;就可以实时可视化查看最后的结果。支持HTML5, Javascript 和 CSS3 元素。UltraEdit ltraEdit 是一套功能超级强大…