java实现支付宝接口---支付_Y呀的博客-程序员宅基地_java支付宝接口

技术标签: spring  java  

java实现实现支付宝接口

蚂蚁沙箱环境 (Beta) 是协助开发者进行接口功能开发及主要功能联调的辅助环境。可以模拟实现支付宝的支付功能。
接下的实现技术是运用到springmvc注解方法实现的支付。

准备工作

  1. 去支付宝开放平台,用你的支付登录开通沙箱支付的服务。支付宝开放平台

  2. 点击右上角的立即入驻之后,确认加入。在这里插入图片描述

  3. 点击导航栏的开发者中心,之后就进入到沙箱应用,再点击右边的设置。在这里插入图片描述

  4. 点击研发服务在这里插入图片描述
    在这里插入图片描述

  5. 使用支付宝秘钥生成器生成自己的私钥和公钥,公钥填至框中,私钥自己保管好。使用工具生成器生成好的密钥会自动给你保存到你的电脑。 然后保存设置。在这里插入图片描述
    在这里插入图片描述

  6. 然后点击查看,可以看到你的公钥和支付宝的公钥,说明你已经配置好了。

  7. 沙箱账号就是买家和商家的账号和密码,还有金额,可以进行充值,手机下载沙箱钱包,用买家账号密码登录即可,就可以扫码付款了,付款的金额就到了商家的账户余额里。

java代码实现支付

  1. 前台发请求的代码,需要获取订单号和订单金额传到后台。
    注意:后台返回的数据格式不能输json类型
    因为json类型的返回的数据
//支付的请求
function topay(price,that){
    
	//获取订单号
	var ono=$(that).attr("id");
	
		$.post("../../apli/pay",{
    ono:ono,price:price},function(data){
    
			$("#apli").html(data);
		},"text")
	}
  1. 支付宝接口的配置类 ApplicationConfig.java
    对应的地方修改成你自己的一些信息。
    特别注意一下异步和同步通知页面路径的处理
public class ApplicationConfig {
    
	    // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
		public static String app_id = "2016102400748299";
	 
		// 商户私钥,您的PKCS8格式RSA2私钥
		public static String merchant_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDTcUPbyeVtd/a7mgtC/cs1QhvXDo8BJM6";
	 
		// 支付宝公钥
	    public static String alipay_public_key = "SuFoWXQxhVJhPW0Gp7WKtBiPSkVovQoOwY/bFKfyDJSY92oS1mNWjoIzr7vS52fc374rm9fVbZPFau5xu5q6hNmOCekM/W9SEKPyxk4lAB+hQYcgiSjGANBo+v3y55OHQIzrylQIDAQAB";
	 
	    /*
	     * 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数
	     * 必须外网可以正常访问
		 * 一般就是支付成功时,修改数据库之类的操作
		 */
		public static String notify_url = "http://localhost:8080/project/apli/update";
		
		/*
		 * 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数
		 * 通知页面一般用来,支付成功后,需要跳转什么页面之类的处理
		 */
	    public static String return_url = "http://localhost:8080/project/apli/return";
	    
		// 签名方式,注意这里,如果步骤设置的是RSA则用RSA
		public static String sign_type = "RSA2";
	 
		// 字符编码格式
		public static String charset = "utf-8";
	 
		// 支付宝网关
		public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
	 
		// 支付宝网关
		public static String log_path = "C:\\";
	}
  1. ApliConfigController.java类。 具体操作的实现
@RestController
@RequestMapping("/apli")
public class ApliConfigController {
    
	
	@RequestMapping("/pay")		//踩坑记录->这里不可直接return result; 必须要response.getWriter().print(result);或者以map键值对方法返回
	public String toPay(String ono,double price,HttpServletRequest request,HttpServletResponse resp,HttpSession session) throws AlipayApiException, IOException, ServletException {
    

		//获得初始化的AlipayClient
		AlipayClient alipayClient = new DefaultAlipayClient(ApplicationConfig.gatewayUrl, ApplicationConfig.app_id, ApplicationConfig.merchant_private_key, "json", ApplicationConfig.charset, ApplicationConfig.alipay_public_key, ApplicationConfig.sign_type);

		//设置请求参数
		AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
		alipayRequest.setReturnUrl(ApplicationConfig.return_url);
		alipayRequest.setNotifyUrl(ApplicationConfig.notify_url);

		alipayRequest.setBizContent("{\"out_trade_no\":\""+ono +"\"," 
				+ "\"total_amount\":\""+ price +"\"," 
				+ "\"subject\":\""+ " Y呀网站支付 " +"\"," 
				+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
		String result = alipayClient.pageExecute(alipayRequest).getBody();
		resp.setContentType("text/html; charset=utf-8");
		resp.getWriter().print(result);
		return null;
	}

	@RequestMapping("/return")
    public void toIndex(HttpServletResponse resp,HttpSession session) throws IOException{
    
		//取session
		MemberInfo member=(MemberInfo) session.getAttribute("loginUser");
		
		//支付成功跳转页面
		PrintWriter out = resp.getWriter();
		out.print("<script>location.href='../front/page/order.html'</script>");
		
		//支付成功后跳转页面你的session会清空,如果还需要可以在存一次session
		session.setAttribute("loginUser", member);
    }
}

支付宝沙箱支付的官方文档

  1. 沙箱支付文档
    更加深入的学习。
  2. 如若有问题,留言,我们一起探讨…
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45003796/article/details/105916908

智能推荐

msgbox函数参数_wuna66320的博客-程序员宅基地_$msgbox

 Application->MessageBox("AA", "BB", MB_OK | MB_ICONSTOP);或MessageBox(Application->Handle,"AA", "BB", MB_OK | MB_ICONSTOP);这种写法“级别”最高:如果弹出这样的对话框,不点掉,Application下所有的Form都不能“动”的。MessageBox(Form1->Hand

【Tips】python中使用pyflann使出现ModuleNotFoundError: No module named ‘index‘解决方案_YK菌的博客-程序员宅基地

在跑ARO模型时,paper: https://arxiv.org/pdf/1604.00989.pdforiginal code https://github.com/varun-suresh/Clustering用到了一个库pyflann,但是出现了问题ModuleNotFoundError: No module named 'index'GitHub主页有人这样说的pyflann问题https://github.com/primetang/pyflann/issues/1sudo 2

网络MSDTC(分布式事务处理协调器)服务配置方法_ciji4412的博客-程序员宅基地

一、启用网络DTC访问的步骤 启用网络DTC是分布式数据库事物控制的必要条件。设置过程应依下面步骤进行。 1)单击“开始”,指向“控制面板”,然后单击“添加或删除程序”; 2)单击“添加/删除 Windows 组件”; 3)选择“应用程序...

重读需求文档--为什么最开始我表现得特别菜?_伤感的developer的博客-程序员宅基地

eodRatea. The current FX EOD rate page will have to include the new CFDs products so that Ops can import the CFD EOD rate into Falcon.b. Ops should also be able to manually add the EOD rate for CFD ...

Python基础--异常处理简单使用_南风依旧的博客-程序员宅基地

文章目录Python基础--异常处理简单使用Exception使用try中else和finally的使用Python基础–异常处理简单使用作用避免程序报错,提高程序的稳定性获取报错信息多用于可以预判的错误进行提前处理# 具体的模板# try 是尝试处理缩进里面的所有内容,报错后,会执行execpt的内容try: 尝试执行内容except: 指定输出错误信息具体的实...

Axon框架使用指南(三):Command模型_王立-Wunglee的博客-程序员宅基地

Command模型        在基于CQRS的应用程序中,领域模型(如Eric Evans和Martin Fowler所定义的)可以是一个非常强大的机制,用于处理状态更改验证和执行过程中涉及的复杂性。虽然典型的领域模型有大量的构建块,但是其中一个在应用于CQRS中的命令处理时扮演主导角色:聚合。应用程序中对状态更改的命令以Command开头。命令描述了你想要做什么以及基于该意图采取行动所需的信...

随便推点

Python NameError: name '_name_' is not define!解决方法_lw_waston的博客-程序员宅基地

大多数错误原因。是 name 和 define 写错了! name 和 define 都是双下划线 不是单下划线!常见错误写法:if _name_==_main_正确写法: if __name__ == __main__ ...

Maven官网下载安装详细教程_抖腿南神经的博客-程序员宅基地_maven下载教程

1、下载安装Maven第一步百度搜索Maven,进入官网第二步在右侧选择Download第三步进入Download页面,选择第三个下载第四步下载后解压,接着是配置环境2、配置环境变量M2_HOME Maven目录下的bin目录MAVEN_HOME Maven目录在系统path中配置%MAVEN_HOME%\bin测试Maven是否配置成功:在命令行中输入mvc -version3、配置阿里云镜像下载jar包时速度快第一步、在setting

小白自学vue(1)_weixin_34310369的博客-程序员宅基地

技能背景:html+css,jquery,js项目背景:公司自己的项目,新业务平台开工前期。新业务平台计划用vue技术栈,但是现有前端都没有接触过然后呢,因为刚进公司不久,手上事情不是多,故自己看了三天官网(cn.vuejs.org),却只理解了{{}} /捂脸为了给自己学习的结果一个交代,根据自己的理解,做了一个超简单的小demo,连组件都没用到,用的是引入vue.js,然后...

求解填字游戏问题(回溯)_qq_45122293的博客-程序员宅基地

在3*3个方格的方阵中填入数字1-10的某9个数字,每个方格填一个整数,使所有相邻两个方格内的两个整数之和为素数。编写一个程序,求出所有满足这个要求的数字的填法。#include&lt;iostream&gt;#include&lt;cmath&gt; using namespace std;int a[11]={0,1,2,3,4,5,6,7,8,9,10};int x[11]; ...

用Java实现弹框(☆)_playboy-jordan的博客-程序员宅基地

效果图代码:@RequestMapping(value="getMessage",method=RequestMethod.POST) @ResponseBody public void getMessage(Long id ){ List&lt;SystemNotice&gt; systemList=userService.selAllSystemNotic(); JFrame frame = new JFrame("系统公告"); frame.setAlways

java双缓冲防闪屏_falldeep的博客-程序员宅基地_java中offscreenimage

原理 首先理解内存绘图,即把要绘制的东西先在内存中画好,然后一次性的画到屏幕上来。内存绘图经常用来防止闪烁。因为闪烁的原因是因为反差太大。例如你的绘图过程是先用白色擦除整个窗口,然后再将黑色的文字画到屏幕上来,这样在窗口重绘的时候,原本黑色文字区域就会白光一闪,然后再出现文字,也就是我们说的闪烁了。而内存绘图的过程呢,是先创建一个内存DC,然后在这个DC上把要绘制的图形画好,之后一次性的填到屏幕上去。实现在类中新建一个Image类型的对象(offScreenImage),作为缓冲 .

推荐文章

热门文章

相关标签