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

news/2024/5/16 2:07:37/文章来源:https://blog.csdn.net/AlbenXie/article/details/88096313

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

支付宝最近推出的支付宝接口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的值有四种

@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,还是其它的,总之你要暴露出这个方法要让支付宝能访问!

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

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

相关文章

联想如何安装linux系统安装步骤,加速本本的启动 - 在ThinkPad上安装Ubuntu的全过程详解_Linux教程_Linux公社-Linux系统门户网站...

加速本本的启动Ubuntu的启动过程默认执行了许多脚本&#xff0c;如在线时间同步、LVM、RAID等而我的本本根不用不到这些&#xff0c;而启动脚本中对于即插即用网络的检测会因为你没有插入网线或者周围没有可用的无线接入点而耽误较长时间。从UbuntuForums里找到解决办法&#x…

Google 联合一些社交网站来对抗 facebook

谷歌(Google) 将与其它一些行业领先的社交网站联手&#xff0c;共同对抗互联网新贵Facebook。  谷歌将于周四推出一个通用标准集 ( OpenSocial )&#xff0c;允许软件开发者为谷歌旗下社交网站Orkut&#xff0c;以及LinkedIn、hi5、Friendster、Plaxo和Ning等其它社交网站开…

国外最火的电商网站magento2:系列(二)nginx、php环境的适配

接着上一篇国外最火的电商网站magento2&#xff1a;系列&#xff08;一&#xff09;虚拟机、centos7的安装 继续说&#xff1a; 刚刚装好centos7&#xff0c;你还需要安装一下需要的小插件&#xff0c;我在这里提供一下&#xff1a; a.安装vim: yum install vim -y b.安装unzi…

11月第4周网络安全报告:遭篡改的.COM网站占75.7%

IDC评述网&#xff08;idcps.com&#xff09;12月07日报道&#xff1a;根据CNCERT抽样监测结果和国家信息安全漏洞共享平台&#xff08;CNVD&#xff09;发布的数据得悉&#xff0c;在11月第4周&#xff08;2015-11-23至2015-11-29&#xff09;期间&#xff0c;我国互联网网络安…

CSDN 未来网站内容Tag架构猜想

大概是上周吧&#xff0c;写了一篇blog主观的分析了一下CSDN目前的内容架构&#xff0c;收到许多朋友好的意见和建议&#xff0c;在此首先对他们表示感谢。网络变化真的很快&#xff0c;现在的网站内容架构较2&#xff0c;3年前已经有翻天覆地的变化。很多人也提出了“如今的网…

网站性能优化三大策略

性能优化是一个复杂的话题&#xff0c;涉及的技能很多&#xff0c;如何通过优化网页性能提高用户体验?今天给大家介绍一些常见的方法。 1. 尽可能减少要传输的数据量 首先&#xff0c;删除所有未使用的部分&#xff0c;例如JavaScript中不可访问的函数、带有永远不匹配任何元素…

构建跨浏览器兼容网站的 8 个基本技巧

一旦你花时间了解一下 Web 浏览器的历史并了解它们的工作原理&#xff0c;构建和测试跨浏览器兼容网站的必要性就显而易见了。 但是&#xff0c;了解跨浏览器工作的 Web 应用程序的重要性是一回事&#xff0c;而为其开发又是另一回事。 虽然几乎不可能让每个浏览器的设计看起来…

提高JavaScript性能技巧,以获得更快的网站

在开发应用程序时&#xff0c;性能是最重要的问题之一&#xff0c;所有软件开发人员都应该监控和改进应用程序每一层的性能。从数据库到服务器端语言&#xff0c;出现性能问题的时候很多&#xff0c;前端当然也不例外。 接下来&#xff0c;让我们看看如何通过七个实用技巧提高 …

centos7利用acme.sh获取Let's Encrypt的永久免费ssl证书并配置网站域名https访问

acme.sh介绍&#xff1a;https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E github&#xff1a;https://github.com/Neilpang/acme.sh 1. 安装 acme.sh 安装非常简单&#xff0c;就一个命令&#xff0c;建议使用root账户进行安装&#xff0c;以下演示都是root账户。…

如何加速 Web 应用程序并提高网站性能

我们不需要提醒你快速网站加载的重要性。要么是 3 秒&#xff0c;要么是用户离开&#xff0c;因此你必须优化网站性能以符合用户的期望。 网站性能的优化是一件大事。它涉及多个方面需要照顾&#xff0c;其中许多取决于网站本身、其复杂性和元素。但是&#xff0c;还有一些适用…

为什么我们应该使用 HTML5 开发网站

HTML 5 是最新的超文本标记语言 (HTML)&#xff0c;它是用于描述网页内容和外观的标准编程语言。如今&#xff0c;所有主要浏览器(Chrome、Safari、Opera 和 IE)都提供 HTML5 支持&#xff0c;这使其成为当今使用的最新 HTML 技术。 下面列出了 HTML5 的一些惊人优势&#xff1…

前 3 大网站性能问题以及如何解决它们

令人惊讶的是&#xff0c;即使现在&#xff0c;你也可以访问已建立组织的主页&#xff0c;但如果开发人员和设计人员知道将故障排除工作的重点放在哪里&#xff0c;则可以轻松解决这些严重的网站性能问题。 在大多数情况下&#xff0c;当今互联网上遇到的最大网站性能问题通常归…

快速网站的简单JavaScript性能优化技巧

JavaScript 可以提供高度交互的网站&#xff0c;以 HTML 单独无法做到的方式积极吸引用户。但是&#xff0c;增加的参与度会带来性能成本&#xff0c;如果允许失控&#xff0c;可能会对网站的可用性产生负面影响。 如果你的网站速度很慢&#xff0c;并且认为页面中嵌入的逻辑可…

Web前端:优化Angular应用程序以提高网站速度的技巧

跨企业领域的许多已知和产生流量的网站都使用网站优化方法进行 Angular Web 开发&#xff0c;Angular 作为前端框架因其功能丰富、健壮、高性能的特点而广受欢迎。 应用内显示的性能问题是直接影响应用对最终用户体验的巨大问题。网络流量下降、商业网站上没有流量或客户参与度…

网站安全之——重放攻击

转自&#xff1a;http://baike.baidu.com/view/1569933.htm 重放攻击&#xff08;Replay Attacks&#xff09;又称重播攻击、回放攻击或新鲜性攻击&#xff08;Freshness Attacks&#xff09;&#xff0c;是指攻击者发送一个目的主机已接收过的包&#xff0c;来达到欺骗系统的目…

Web前端:如何为网站选择最佳的JavaScript框架?

我们都知道JavaScript框架对于优化整个网站开发过程有多么重要&#xff0c;企业可以节省时间、精力和金钱。没有一个框架适合所有任务&#xff0c;每一个都有其优点和缺点&#xff0c;应该根据项目的需要进行选择。选择正确的框架需要检查它是否停滞&#xff0c;并定期检查和修…

网站安全之——session劫持

转自&#xff1a;http://www.cnblogs.com/shoru/archive/2010/02/19/1669395.html 引言 在web开发中&#xff0c;session是个非常重要的概念。在许多动态网站的开发者看来&#xff0c;session就是一个变量&#xff0c;而且其表现像个黑洞&#xff0c;他只需要将东西在合适的时机…

网站安全之——文件上传攻击漏洞

转自&#xff1a;http://www.h3c.com.cn/About_H3C/Company_Publication/IP_Lh/2014/05/Home/Catalog/201408/839582_30008_0.htm 不少系统管理员都有过系统被上传后门&#xff0c;木马或者是网页被人篡改的经历&#xff0c;这类攻击相当一部分是通过文件上传进行的。入侵者是如…

SEO 比比看: Che168.com VS pcauto.com.cn

SEO 比比看&#xff1a; Che168.com VS pcauto.com.cn做SEO工作&#xff0c;平常少不了多观察各种网站优化的案例。俗话说的好&#xff0c;懂行的看门道&#xff0c;不懂的看热闹。面对五花八门的网站&#xff0c;如何才能从专家的角度&#xff0c;以最快的速度来了解被观察网…

搜索引擎SEO外挂:一边搜索,一边看PageRank

搜索引擎SEO外挂&#xff1a;一边搜索&#xff0c;一边看PageRank下载地址&#xff1a;多么乐站长工具 我原来曾写过一篇统计分析搜索引擎排名和Page Rank 关联分析 的文章。很多人引用&#xff0c;回复和我讨论了我的结论。有赞成的&#xff0c;有反对的&#xff0c;有鼓励的&…