SpringMVC 实现支付宝支付功能(沙箱环境)

springMVC实现的沙箱环境下的支付宝支付的功能,是沙箱环境下的,这里只演示电脑上的扫码支付。没事就玩玩嘛

本文参考了支付宝官方文档:https://docs.open.alipay.com/catalog

首先先进入支付宝的开放平台,点击“开放平台-开发者中心-沙箱环境”。进入沙箱环境页面。

第一次使用需要先进行申请,然后获取到APPID,有这个才能调用支付宝开放产品的接口。

申请的话。我这里就不说了。这个不会的话就评论找我吧。

一:准备环境

首先你需要下载支付宝的SDK,我这里推荐使用maven来下载(官方也推荐)

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.0.0</version>
</dependency>

这里废话一句,推荐使用maven的时候配置一下阿里的镜像。下载jar包的时候会快一些。

然后你可以阅读一下下面的流程,请参考下面链接生成RSA密钥

https://docs.open.alipay.com/291/105971

然后配置好公钥后会在页面会自动的给你生成好下面的图片上的代码,这个非常有用。红色那块东西写着是要你去复制上一步中生成的密钥中的商户应用私钥。

这里注意一下:如果你配置公钥后再重新生成了一次公钥,请重新配置,不然在你跑接口的时候会报错的。

上面图片这个地方找不到就打开下面这个链接吧:

https://openhome.alipay.com/platform/appDaily.htm

在刚才的开发平台页面下面去下载沙箱环境的支付宝APP(安卓版的)

二:具体实现

当你做完上面的工作后,可以直接进行开发了。你可以进行分层的开发,我这边就全部写在Controller层上了。

在测试的时候你直接在浏览器发起get请求来访问这个方法,支付个1000W尝试一下支付的快感吧!!!

不要直接粘贴下面的代码直接运行

记得替换下面我标注的地方!

记得替换下面我标注的地方!

记得替换下面我标注的地方!

重要的事情要多讲

@RequestMapping("/ailpay")
	public void 方法名(HttpServletRequest request, HttpServletResponse response)
			throws IOException {
		AlipayClient alipayClient = new
				DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do",
				"你的APPID",
				"生成的密钥中的商户应用私钥",
				"json","utf-8",
				"公钥",
				"RSA2" );
                //上面这个方法是不是很眼熟?就是刚才配置完公钥后生成的那段,你可以直接复制然后加上你的私钥就好
		String out_trade_no = "订单号";
		out_trade_no = URLDecoder.decode(out_trade_no,"UTF-8");
		String total_amount = "总金额";
		total_amount = URLDecoder.decode(total_amount,"UTF-8");
		String subject = "商品名称";
		subject = URLDecoder.decode(subject,"UTF-8");
		String body = "商品描述";
		body = URLDecoder.decode(body,"UTF-8");

		AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//创建API对应的request
		alipayRequest.setReturnUrl("回调接口");
		alipayRequest.setBizContent("{" +
				"    \"out_trade_no\":\""+ out_trade_no +"\"," +
				"    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
				"    \"total_amount\":"+ total_amount +"," +
				"    \"subject\":\""+ subject +"\"," +
				"    \"body\":\""+ body +"\"" +
				"    }"+
				"  }");//填充业务参数
		String form="";
		try {
			form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
		} catch (AlipayApiException e) {
			e.printStackTrace();
		}
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().println(form);//直接将完整的表单html输出到页面
		response.getWriter().close();

	}

这边我没有把全部的参数都加上,你们可以参考一下下面的参数(我复制了支付宝官方给出的公共的请求参数):

公共参数

请求地址

环境HTTPS请求地址
正式环境https://openapi.alipay.com/gateway.do

公共请求参数

参数类型是否必填最大长度描述示例值
app_idString32支付宝分配给开发者的应用ID2014072300007148
methodString128接口名称alipay.trade.pay
formatString40仅支持JSONJSON
charsetString10请求使用的编码格式,如utf-8,gbk,gb2312等utf-8
sign_typeString10商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2RSA2
signString344商户请求参数的签名串,详见签名详见示例
timestampString19发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"2014-07-24 03:07:50
versionString3调用的接口版本,固定为:1.01.0
notify_urlString256支付宝服务器主动通知商户服务器里指定的页面http/https路径。http://api.test.alipay.net/atinterface/receive_notify.htm
app_auth_tokenString40详见应用授权概述 
biz_contentString 请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档 

请求参数

参数类型是否必填最大长度描述示例值
out_trade_noString必选64商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复20150320010101001
sceneString必选32支付场景 
条码支付,取值:bar_code 
声波支付,取值:wave_code
bar_code
auth_codeString必选32支付授权码,25~30开头的长度为16~24位的数字,实际字符串长度以开发者获取的付款码长度为准28763443825664394
product_codeString可选32销售产品码FACE_TO_FACE_PAYMENT
subjectString必选256订单标题Iphone6 16G
buyer_idString可选28买家的支付宝用户id,如果为空,会从传入了码值信息中获取买家ID2088202954065786
seller_idString可选28如果该值为空,则默认为商户签约账号对应的支付宝用户ID2088102146225135
total_amountPrice可选11订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000] 
如果同时传入【可打折金额】和【不可打折金额】,该参数可以不用传入; 
如果同时传入了【可打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【可打折金额】+【不可打折金额】
88.88
trans_currencyString可选8标价币种, total_amount 对应的币种单位。支持英镑:GBP、港币:HKD、美元:USD、新加坡元:SGD、日元:JPY、加拿大元:CAD、澳元:AUD、欧元:EUR、新西兰元:NZD、韩元:KRW、泰铢:THB、瑞士法郎:CHF、瑞典克朗:SEK、丹麦克朗:DKK、挪威克朗:NOK、马来西亚林吉特:MYR、印尼卢比:IDR、菲律宾比索:PHP、毛里求斯卢比:MUR、以色列新谢克尔:ILS、斯里兰卡卢比:LKR、俄罗斯卢布:RUB、阿联酋迪拉姆:AED、捷克克朗:CZK、南非兰特:ZAR、人民币:CNYUSD
settle_currencyString可选8商户指定的结算币种,支持英镑:GBP、港币:HKD、美元:USD、新加坡元:SGD、日元:JPY、加拿大元:CAD、澳元:AUD、欧元:EUR、新西兰元:NZD、韩元:KRW、泰铢:THB、瑞士法郎:CHF、瑞典克朗:SEK、丹麦克朗:DKK、挪威克朗:NOK、马来西亚林吉特:MYR、印尼卢比:IDR、菲律宾比索:PHP、毛里求斯卢比:MUR、以色列新谢克尔:ILS、斯里兰卡卢比:LKR、俄罗斯卢布:RUB、阿联酋迪拉姆:AED、捷克克朗:CZK、南非兰特:ZAR、人民币:CNYUSD
discountable_amountPrice可选11参与优惠计算的金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]。 
如果该值未传入,但传入了【订单总金额】和【不可打折金额】,则该值默认为【订单总金额】-【不可打折金额】
8.88
bodyString可选128订单描述Iphone6 16G
 goods_detailGoodsDetail[]可选 订单包含的商品列表信息,json格式,其它说明详见商品明细说明 
operator_idString可选28商户操作员编号yx_001
store_idString可选32商户门店编号NJ_001
terminal_idString可选32商户机具终端编号NJ_T_001
 extend_paramsExtendParams可选 业务扩展参数 
timeout_expressString可选6该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m90m
auth_confirm_modeString可选32预授权确认模式,授权转交易请求中传入,适用于预授权转交易业务使用,目前只支持PRE_AUTH(预授权产品码) 
COMPLETE:转交易支付完成结束预授权,解冻剩余金额; NOT_COMPLETE:转交易支付完成不结束预授权,不解冻剩余金额
COMPLETE:转交易支付完成结束预授权;NOT_COMPLETE:转交易支付完成不结束预授权
terminal_paramsString可选2048商户传入终端设备相关信息,具体值要和支付宝约定{"key":"value"}


你可以按照业务的需求来对请求参数进行设置,下面展示一下回调的响应参数

公共响应参数

参数类型是否必填最大长度描述示例值
codeString-网关返回码,详见文档40004
msgString-网关返回码描述,详见文档Business Failed
sub_codeString-业务返回码,参见具体的API接口文档ACQ.TRADE_HAS_SUCCESS
sub_msgString-业务返回码描述,参见具体的API接口文档交易已被支付
signString-签名,详见文档DZXh8eeTuAHoYE3w1J+POiPhfDxOYBfUNn1lkeT/V7P4zJdyojWEa6IZs6Hz0yDW5Cp/viufUb5I0/V5WENS3OYR8zRedqo6D+fUTdLHdc+EFyCkiQhBxIzgngPdPdfp1PIS7BdhhzrsZHbRqb7o4k3Dxc+AAnFauu4V6Zdwczo=

响应参数

参数类型是否必填最大长度描述示例值
trade_noString必填64支付宝交易号2013112011001004330000121536
out_trade_noString必填64商户订单号6823789339978248
buyer_logon_idString必填100买家支付宝账号159****5620
total_amountPrice必填11交易金额120.88
trans_currencyString选填5标价币种, total_amount对应的币种单位。目前支持英镑:GBP、港币:HKD、美元:USD、新加坡元:SGD、日元:JPY、加拿大元:CAD、澳元:AUD、欧元:EUR、新西兰元:NZD、韩元:KRW、泰铢:THB、瑞士法郎:CHF、瑞典克朗:SEK、丹麦克朗:DKK、挪威克朗:NOK、马来西亚林吉特:MYR、印尼卢比:IDR、菲律宾比索:PHP、毛里求斯卢比:MUR、以色列新谢克尔:ILS、斯里兰卡卢比:LKR、俄罗斯卢布:RUB、阿联酋迪拉姆:AED、捷克克朗:CZK、南非兰特:ZAR、人民币:CNYUSD
settle_currencyString选填8商户指定的结算币种,目前支持英镑:GBP、港币:HKD、美元:USD、新加坡元:SGD、日元:JPY、加拿大元:CAD、澳元:AUD、欧元:EUR、新西兰元:NZD、韩元:KRW、泰铢:THB、瑞士法郎:CHF、瑞典克朗:SEK、丹麦克朗:DKK、挪威克朗:NOK、马来西亚林吉特:MYR、印尼卢比:IDR、菲律宾比索:PHP、毛里求斯卢比:MUR、以色列新谢克尔:ILS、斯里兰卡卢比:LKR、俄罗斯卢布:RUB、阿联酋迪拉姆:AED、捷克克朗:CZK、南非兰特:ZAR、人民币:CNYUSD
settle_amountString选填11结算币种订单金额88.88
pay_currencyString选填8支付币种CNY
pay_amountString选填11支付币种订单金额580.04
settle_trans_rateString选填32结算币种兑换标价币种汇率1
trans_pay_rateString选填32标价币种兑换支付币种汇率6.5261
receipt_amountString必填11实收金额88.88
buyer_pay_amountPrice选填11买家付款的金额8.88
point_amountPrice选填11使用集分宝付款的金额8.12
invoice_amountPrice选填11交易中可给用户开具发票的金额12.50
gmt_paymentDate必填32交易支付时间2014-11-27 15:45:57
 fund_bill_listTradeFundBill必填 交易支付使用的资金渠道 
card_balancePrice选填11支付宝卡余额98.23
store_nameString选填512发生支付交易的商户门店名称证大五道口店
buyer_user_idString必填28买家在支付宝的用户id2088101117955611
discount_goods_detailString选填1024本次交易支付所使用的单品券优惠的商品优惠信息[{"goods_id":"STANDARD1026181538","goods_name":"雪碧","discount_amount":"100.00","voucher_id":"2015102600073002039000002D5O"}]
 voucher_detail_listVoucherDetail选填 本交易支付时使用的所有优惠券信息 
auth_trade_pay_modeString选填64预授权支付模式,该参数仅在信用预授权支付场景下返回。信用预授权支付:CREDIT_PREAUTH_PAYCREDIT_PREAUTH_PAY
business_paramsString选填512商户传入业务信息,具体值要和支付宝约定 
将商户传入信息分发给相应系统,应用于安全,营销等参数直传场景 
格式为json格式
{"data":"123"}
buyer_user_typeString选填18买家用户类型。CORPORATE:企业用户;PRIVATE:个人用户。PRIVATE
mdiscount_amountString选填11商家优惠金额88.88
discount_amountString选填11平台优惠金额88.88

可以参考一下我写的回调接口:

@RequestMapping("success")
	public ModelAndView success(String out_trade_no,Double total_amount){
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("success");
		modelAndView.addObject("money",total_amount);
		modelAndView.addObject("no",out_trade_no);
		return modelAndView;
	}


好了,本文就到这了。赶紧玩起来吧~~~

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值