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

java在SSM下使用支付宝扫码支付 准备工作首先开通支付宝沙箱的测试账号,里面会有消费者账户和收款方账户 手机扫码下载手机端app 基础配置所需jar包AlipayConfigpackage com.alipay.config;import java.io.FileWriter; import java.io.IOException; import java.util.ResourceBundle;/* * *类名:Alipay 阅读详情

首先就是申请支付宝第三方接口,获取到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这是从支付宝开放平台获取的APPID
	public 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";
	// RSA2
	public 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 block
		e.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大型互联网技术的视频免费分享给大家。

使用Simulink来模拟多旋翼无人机在风扰动条件下的飞行情况,并分析其稳定性 本教程详细介绍了使用Simulink进行多旋翼无人机风扰动稳定性分析的完整流程。首先构建包含飞行器动力学模型、控制系统和环境模拟模块的系统框架,重点讲解简化动力学方程的实现方法。随后指导设计PID控制器来维持姿态稳定,并添加随机风扰动模型模拟环境干扰。通过设置输入信号和输出显示,最终实现对不同风速条件下无人机控制性能的评估。该实例为无人机控制系统设计提供了实用的仿真方法,强调利用MATLAB工具进行可视化分析和参数优化,以提高系统抗干扰能力和稳定性。 阅读详情

相关推荐

PCIE6.0协议学习小记-Flit_Mode

PCIE6.0学习

code_aJack的博客 4645

支付宝Java版手机网站支付

支付宝支付系列课程详细讲解支付宝支付的相关知识点,包括:条码支付、扫码支付、电脑网站支付、手机网站支付。

载波同步技术(一):BPSK的Costas Loop 载波同步

Author:McCrocodile 2010/11/04          载波的提取在相干解调中往往比较重要,根据信号中是否包含载频分量,载波同步一般也可以分为两种方法。包含载频分量的可以采用窄带滤波或者基本的锁相环环路来实现,不包含的则比较麻烦需要采用特殊的环路实现载波的同步。这里介绍的BPSK的载波恢复就属于后面一种。 对于不包含载频分量的信号载波同步一般有:同相-正交环(就是常说的Costas环)、判决反馈环(几乎可以适用所有调制方式)、同相-正交环衍生环(QPSK松尾环、N相同相-正交环)。

McCrocodile Blog 1万+

饿了么开放接口交流QQ群

饿了么开放接口交流QQ群:  422758736 这个是饿了么开放接口官方的交流群。群里也有几位大佬很热心帮人解决问题。 对于刚刚开始对接饿了么API接口的技术开发人员,一定程度上会有帮助。 本人也做了饿了么接口开发对接的,大家有什么不懂也可以加我QQ:308205428 我懂得都会帮大家解答。 希望可以帮大家解决问题。如果有兴趣可以进博主的网站看看。www.jiegelo.com

qq_38377190的博客 3243

详解卷积神经网络(CNN)

卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。

qq_25762497的博客 25万+

【BAAS】基于supabase的知识库详细设计

为满足快速开发需要和减少开发及维护成本,使用BAAS(Backend-as-a-Service)模式可以很好的降低我们的后端维护成本,并提高前端对接效率。一般来说,BAAS是一种云服务模式,BaaS供应商会为提供一些通用的能力,例如用户身份验证、数据库管理、远程更新和推送通知(针对移动应用程序),以及云存储和自托管。BaaS最主流的是Google的firebase,具有相当完善的功能和集成方案,但他是收费的,而且在我们实际项目中,可能需要私有化部署,这时就需要一些开源的替代方案,例如主流的。

Ric的博客 1781

对接支付宝、微信、第三方支付,超详细讲解+demo演示

对接支付宝、微信、第三方支付,超详细讲解+demo演示入门1.接入指南开始接入有效的扫呗接入资料:1.1.1. 开通支付通道1.2. 通信协议1.3. 接口安全1.3.1. 签名1.3.2. 警告1.3.3. 常见问题2.支付流程 入门 我最近在网上找了很多关于对接第三方支付的文章,基本上都没有demo,所以我准备花一周时间把对接第三方详细步骤和demo发出来供大家使用! 我先说一下对接第三方和对...

qq_40286444的博客 2万+

用51单片机和LD3320语音模块DIY一个会说话的温度报警器(附完整代码)

本文详细介绍了如何使用51单片机和LD3320语音模块DIY一个智能温度报警器,包括硬件选型、电路设计、软件开发及核心功能实现。通过DS18B20温度传感器和语音模块的结合,实现温度超标时的语音报警功能,适合智能家居系统等应用场景。附完整代码,方便开发者快速复现。

weixin_42525632的博客 421

支付-支付宝接口全流程

有pom和模板 可以改成自己的

PaoShan的博客 1万+

基于STM32、HAL库的MCP4651-503E/ST数字电位器驱动程序设计

@param channel: 通道 (0: A通道, 1: B通道)* @param channel: 通道 (0: A通道, 1: B通道)// SPI1 SCK/MISO/MOSI引脚配置。* @param hmcp: MCP4651句柄。* @param hmcp: MCP4651句柄。* @param hmcp: MCP4651句柄。* @param hmcp: MCP4651句柄。* @param hmcp: MCP4651句柄。* @param hspi: SPI句柄。

corlin6688的博客 137

DCMM评估报告模板样例

这篇DCMM评估报告对某数据管理公司2020年的数据管理能力进行了全面分析。报告显示,该公司在数据战略方面取得初步进展,但在数据治理和数据架构方面仍存在明显不足,包括缺乏有效治理流程、数据质量监控不足,以及数据标准化和转换灵活性不足等问题。评估报告提出了针对性改进建议,包括完善数据战略、建立治理流程、加强质量监控和提升数据转换灵活性等,为提升数据管理成熟度提供了重要指导。

cdfunlove的博客 166

常见支付接口对接

支付对接官网

Java后端技术栈 1305

YOLO系列算法改进 | Head改进篇 | 融合Detect_LSCD轻量共享卷积检测头 | 轻量化设计破解计算瓶颈,增强复杂场景目标感知能力

YOLO系列算法改进 | Head改进篇 | 融合Detect_LSCD轻量共享卷积检测头 | 轻量化设计破解计算瓶颈,增强复杂场景目标感知能力 (以YOLO26最新目标检测模型为基础,融合Detect_LSCD检测头进行改进)

2502_91881744的博客 705

企业支付宝账号开发接口教程--JAVA-UTF-8

企业支付宝账号开发教程--JAVA-UTF-8 账号注册就自己去注册吧。API,开发。网站建设。电子账单。支付宝付款。SpringMVC+JSP开发企业支付宝 目录[-] 总结:企业支付宝接口开发基本完善。页面和小功能需要自己修改就可以了。没有什么可难的。接口开发。只要明白怎么跳转就可以了。支付宝开发文档说的很明白的。 关于即时到账的开发。审核通过。简单测试如下。 希望

从菜鸟到菜菜鸟 2万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java应用场景 一 模拟: 支付宝支付 + 短信验证

个人网站实现支付宝支付 学习Java web,对于电商支付应用…应该比较频繁; 前期准备沙箱环境 首先要登录支付宝~ 进入管理中心, 阿里巴巴提供的开发者中心控制台 开发选择中选择 研发服务 这里提供了一些沙盒模型. 可以进行测试模拟交易。。。 沙盒应用: 这里的RSA2密钥最好设置下,我已经设置好了,所以便有了支付宝公钥(公钥是对外公开的,私钥是自己保留的具体的不多做解释) 工具的话官方都有提供: 使用商户公钥——获取支付宝公钥但是私钥还是要保存的, 自己还需要用私钥来建立连接.... 将

慈様 2865

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

详解JAVA实现支付宝接口编程

//实现java支付宝很简单,只要从支付宝官方下载 http://help.alipay.com/support/index_sh.htm下载程序,配置一下参数就OK了;  1.先到http://help.alipay.com/support/index_sh.htm下接口程序,右下角有个“接口资料下载”点击下载进入下载页面http://club.alipay.com/read.php

chajinglong的专栏 3万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring MVC+Spring+Mybatis实现支付宝支付功能(图文详解+完整代码)

Spring MVC+Spring+Mybatis实现支付宝支付功能(图文详解+完整代码)支付宝测试环境代码测试源代码 支付宝测试环境代码测试 源代码 https://github.com/OUYANGSIHAI/sihai-maven-ssm-alipay 1.下载电脑网站的官方demo: 下载:https://docs.open.alipay.com/270/106291/ 2.下载解压导入...

m0_37540783的博客 1197

java版支付宝app支付流程及原理分析

java版支付宝app支付流程及原理分析 仅作保存 这个支付宝没有经过使用   本实例是基于springmvc框架编写 一、流程步骤 1.执行流程 当手机端app(就是你公司开发的app)在支付页面时,调起服务端(后台第1个创建订单接口)接口,后台把需要调起支付宝支付的参数返回给手机端,手机端拿到 这些参数后,拉起支付...

lqlscn的博客 2376

支付宝app支付java后台流程

ava版支付宝app支付流程及原理分析   本实例是基于springmvc框架编写      一、流程步骤          1.执行流程            当手机端app(就是你公司开发的app)在支付页面时,调起服务端(后台第1个创建订单接口)接口,后台把需要调起支付宝支付的参数返回给手机端,手机端拿到          这些参数后,拉起支付宝支付环境完成支付,完成支付后会调

weixin_37566862的博客 2412

企业支付宝账号开发接口教程--JAVA

关于即时到账的开发。审核通过。简单测试如下。 希望看的可以收藏或者赞一下哦。 1:拥有自己的支付宝企业账号。去产品商店选择适合自己的方案。并签约合同。 2:选择合适的商家收款产品并去签约。填写相应的信息 3:在商家服务会有PID和KEY是关键的东西。 4:选择自己签约的产品类型,下载对应的接口api与测试代码 即时到账收款 -

my_name_nb的博客 5688

支付宝app支付java

支付宝app支付java后台流程、原理分析(含nei wang chuan tou) java版支付宝app支付流程及原理分析  本实例是基于springmvc框架编写     一、流程步骤         1.执行流程           当手机端app(就是你公司开发的app)在支付页面时,调起服务端(后台第1个创建订单接口)接口,后台把需要调起支付宝支付的参数返回给手机端,手机端拿到  ...

java_2017_csdn的博客 513
上一篇: kafka 数据可靠性深度解读
下一篇: 用Spring Boot颠覆Java应用开发
javaQQ群 866865133
博客等级 码龄8年 59粉丝 309原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值