支付宝支付-电脑网站支付
官方文档
支付接口(alipay.trade.page.pay):
- 商户系统请求支付宝接口alipay.trade.page.pay,支付宝对商户请求参数进行校验,而后重定向至用户登录页面。
- 用户确认支付后,支付宝get请求returnUrl(商户入参传入),返回同步返回参数。
交易成功后,支付宝post请求notifyUrl(商户入参传入),返回异步通知参数。 - 若由于网络等问题异步通知没有到达,商户可自行调用alipay.trade.query接口进行查询,根据查询接口获取交易以及支付信息(商户也可以直接调用查询接口,不需要依赖异步通知)。
电脑网站支付和微信支付模式二很有相似点:微信支付-模式二,只是最后一步的处理有点小差别
代码编写(可参考官方demo:支付宝SDK、demo下载)
- 首先下载sdk导入项目(此步骤省略)
- 注入支付宝sdk到Spring
引入阿里配置:pay.properties
<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>/WEB-INF/config/application.properties</value><value>/WEB-INF/config/qqconnectconfig.properties</value><value>/WEB-INF/config/pay.properties</value></list></property></bean>
pay.properties
#支付宝支付参数
#dev环境:ali.serverUrl=https://openapi.alipaydev.com/gateway.do
ali.serverUrl=https://openapi.alipay.com/gateway.do
ali.appId=xxxx
ali.privateKey=xxxx
ali.format=json
ali.charset=utf-8
ali.alipayPulicKey=xxxx
ali.signType=RSA2
#通知地址
ali.notifyUrl=http://xxxx/xxxx/xxxx.do
#回调地址
ali.returnUrl=http://xxxx/xxxx/xxxx.do
Spring注入支付宝sdk
<!--阿里支付api--><bean name="defaultAlipayClient" class="com.alipay.api.DefaultAlipayClient"><constructor-arg name="serverUrl" value="${ali.serverUrl}"/><constructor-arg name="appId" value="${ali.appId}"/><constructor-arg name="privateKey" value="${ali.privateKey}"/><constructor-arg name="format" value="${ali.format}"/><constructor-arg name="charset" value="${ali.charset}"/><constructor-arg name="alipayPulicKey" value="${ali.alipayPulicKey}"/><constructor-arg name="signType" value="${ali.signType}"/></bean>
- 支付接口
/*** 阿里支付** @param money 金额*/@RequestMapping(value = "aliPay")public String aliPay(HttpServletResponse res, HttpServletRequest request,@RequestParam BigDecimal money) throws IOException {final String session = BaseUtil.getUserSession(request);if (StringUtils.isBlank(session)) {LOG.error(String.format("pc阿里支付错误:%s", "用户未登录"));return "redirect:/view/404.html";}//保存订单final PayModel aliPayModel;try {aliPayModel = webUserPayManager.requestAliPay(money, session);} catch (AlipayApiException e) {e.printStackTrace();LOG.error(String.format("pc阿里支付错误:%s", e.getMessage()), e);return "redirect:/view/404.html";}res.setContentType("text/html;charset=utf-8");//直接将完整的表单html输出到页面res.getWriter().write(aliPayModel.getBody());res.getWriter().flush();res.getWriter().close();return null;}
WebUserPayManager
@Autowiredprivate AliPay aliPay;/*** 保存订单信息** @param* @return* @throws PayException 支付异常,返回失败抛出异常 回滚订单数据*/@Transactional(rollbackFor = Exception.class)public PayModel requestAliPay(BigDecimal buyMoney, String userId) throws AlipayApiException {//写入业务逻辑,返回订单信息final WzzwwUserPay userPay = saveUserPay(buyMoney, userId, false);Map<String, String> content = new HashMap<>(3);//订单号content.put("out_trade_no", userPay.getOrderId());//总金额content.put("total_amount", String.valueOf(userPay.getBuyMoney().doubleValue()));//商品标题content.put("subject", "xxx");content.put("product_code", "FAST_INSTANT_TRADE_PAY");PayModel aliPayModel = aliPay.pagePay(content);if (!aliPayModel.isSuccess()) {throw new PayException(String.format("调用支付出错:%s", aliPayModel.getMsg()));}return aliPayModel;}
AliPay(这里只做了pagePay,注意request,不同的支付使用不一样,可以打开源码包看看,官方文档中也写得很详细),其他参数参考下单接口支付宝统一下单接口
@Value(value = "${ali.alipayPulicKey}")private String alipayPulicKey;@Value(value = "${ali.notifyUrl}")private String notifyUrl;@Value(value = "${ali.returnUrl}")private String returnUrl;@Autowiredprivate AlipayClient alipayClient;/*** 支付** @return* @throws AlipayApiException*/public PayModel pay(Map<String, String> content)throws AlipayApiException {return pay(returnUrl, notifyUrl, content);}/*** 支付** @return* @throws AlipayApiException*/public PayModel pay(String returnUrl, String notifyUrl, Map<String, String> content)throws AlipayApiException {AlipayTradePrecreateRequest alipayRequest = new AlipayTradePrecreateRequest();//设置业务参数alipayRequest.setBizContent(JSONObject.toJSONString(content));alipayRequest.setNotifyUrl(notifyUrl);alipayRequest.setReturnUrl(returnUrl);AlipayTradePrecreateResponse response = alipayClient.execute(alipayRequest);return new PayModel(response.isSuccess(), response.getMsg(),JSONObject.parseObject(response.getBody()));}/*** 支付** @return* @throws AlipayApiException*/public PayModel pagePay(Map<String, String> content)throws AlipayApiException {return pagePay(returnUrl, notifyUrl, content);}/*** 支付** @return* @throws AlipayApiException*/public PayModel pagePay(String returnUrl, String notifyUrl, Map<String, String> content)throws AlipayApiException {AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//设置业务参数final String bizContent = JSONObject.toJSONString(content);alipayRequest.setBizContent(bizContent);alipayRequest.setNotifyUrl(notifyUrl);alipayRequest.setReturnUrl(returnUrl);final AlipayTradePagePayResponse response = alipayClient.pageExecute(alipayRequest);return new PayModel(response.isSuccess(), response.getMsg(),response.getBody());}public String getAlipayPulicKey() {return alipayPulicKey;}public String getNotifyUrl() {return notifyUrl;}public String getReturnUrl() {return returnUrl;}
PayModel
/*** ali支付返回信息** @author LiRui* @version 1.0*/
public class PayModel {private boolean success;private String msg;private JSONObject data;private String body;private PayModel() {}public PayModel(final boolean success, final JSONObject data) {this.success = success;this.data = data;}public PayModel(final boolean success, final String msg) {this.success = success;this.msg = msg;}public PayModel(final boolean success, final String msg, final JSONObject data) {this.success = success;this.msg = msg;this.data = data;}public PayModel(final boolean success, final String msg, final String body) {this.success = success;this.msg = msg;this.body = body;}public String getMsg() {return msg;}public void setMsg(final String msg) {this.msg = msg;}public boolean isSuccess() {return success;}public void setSuccess(final boolean success) {this.success = success;}public JSONObject getData() {return data;}public void setData(final JSONObject data) {this.data = data;}public String getBody() {return body;}public void setBody(final String body) {this.body = body;}
}
这里是调用阿里API生成xml表单,然后返回到页面跳转到阿里支付
- 支付回调接口(配置中的returnUrl地址)
/*** 阿里回调** @param request*/@RequestMapping(value = "aliPayNotify")public String aliPayNotify(HttpServletRequest request)throws AlipayApiException, UnsupportedEncodingException {//获取支付宝GET过来反馈信息Map<String, String> params = new HashMap<>();Map<String, String[]> requestParams = request.getParameterMap();for (String name : requestParams.keySet()) {String[] values = requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";}//乱码解决,这段代码在出现乱码时使用valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}boolean verifyResult = AlipaySignature.rsaCheckV1(params, aliPay.getAlipayPulicKey(), "utf-8", "RSA2");if (!verifyResult) {LOG.error(String.format("pc阿里支付回调错误,验签失败:%s", params.toString()));return "redirect:/view/404.html";}//验证成功//业务idString outTradeNo = params.get("out_trade_no");final String buyerPayAmount = params.get("total_amount");if (StringUtil.isEmpty(outTradeNo)) {LOG.error(String.format("pc阿里支付回调错误,out_trade_no为空:%s", params.toString()));return "redirect:/view/404.html";}//处理订单回调逻辑,设置订单业务final boolean finishOrder = webUserPayManager.finishOrder(outTradeNo, BigDecimal.valueOf(Float.valueOf(buyerPayAmount)));return finishOrder ? "redirect:/view/user/index.jsp#/finance": "redirect:/view/index.jsp";}
官方demo写的也很详细,可以直接参考官方demo。测试使用时一定要是用外网,可以搜索natapp工具使用穿透到外网,官方的沙箱也很好用:支付宝沙箱使用
支付宝支付-电脑网站支付相关推荐
- php支付宝系列之电脑网站支付,一个PHP文件搞定支付宝之电脑网站支付
本篇文章给大家分享的内容是关于用一个PHP文件搞定支付宝之电脑网站支付 ,有需要的朋友可以参考一下 网上的很多PHP支付宝支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文 ...
- SpringBoot整合支付宝之电脑网站支付
SpringBoot整合支付宝之电脑网站支付 一.支付宝介绍 1.2 过程分析 1.3 对接支付宝的准备工作 1.4 申请步骤: 2.支付功能实现 2.1 思路分析 2.2 编写支付宝支付接口 2.2 ...
- 支付宝支付 - 电脑网站支付
目录 1. 支付宝支付 - 配置 2. 支付宝支付 - 电脑网站支付 一.引用dll 二.发起支付 /// <summary> /// 支付 /// </summary> // ...
- PHP开发支付宝之电脑网站支付--流程简介
前言 前端时间自己开发了一个drupal的支付宝模块,现在整理一下过程,因为支付宝官方网站提供的接口及文档都是新接口的,而且使用新接口的过程比较麻烦一点,所以整理一下 1.支付宝的账号必须经过企业资格 ...
- 支付宝系列-电脑网站支付
1.概念 电脑网站支付,也称扫码支付,是专门针对PC端业务而开发的一种支付方式,既有支付宝提供在网页展示一个动态生成的支付二维码,用户通过手机支付宝扫码以后可实现支付功能的一种支付方式. 2.创建应用 ...
- 支付宝支付-电脑网站支付开发
公司产品需要做一个订单系统,需要在线下单支付功能,由于时间紧,任务重,选择了阿里的电脑网站支付作为支付的手段接入.一定要区分阿里的扫码支付和电脑网站支付的区别,刚开始我就搞混了.网站支付的页面类似于下 ...
- Java之支付宝支付(电脑网站支付)沙箱测试版
支付宝支付流程及注意事项(沙箱测试版) 一:支付宝支付接入准备工作: 首先,支付宝支付和微信支付意愿,都是只支持企业用户,个人用户是不能接入支付宝支付的,所以要想接入支付宝支付,首先需要有支付宝的企业 ...
- 支付宝之电脑网站支付(保姆版)
大家好,我是大史兄弟,一个不断摸索爬行的程序员.看CSND文章已经有好多年了,但是写文章还是第一次.我不是行业的大牛,只是一个希望不断进步成为大牛的小白程序员. 不知道有没有和我一样情况的,学 ...
- 接入支付宝电脑网站支付实现JAVA版
简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址,因为我这些服务天天在更新,而我的文章是教大家方法,而让你不是照葫芦画瓢 ...
最新文章
- python笔记day4
- 读书笔记6pandas简单使用
- LINUX任务(jobs)详解
- Edge好用么?几条你不知道的Edge小技巧
- Hibernate框架ORM的实现原理-不是技术的技术
- 思科决定将不修复路由器中的这70多个漏洞
- 死磕 java同步系列之AQS起篇
- 1042 cant get hostname for your address
- 自定义表单-列表字段的数据源绑定
- Linux上screen命令如何安装,Linux screen命令,Linux screen用法,Linux screen简单用法,Linux screen安装...
- oracle应收模块报表,OracleERPEBS应收模块AR概要培训ppt课件
- jQuery——常用API
- 桥本分数式(用递归法实现全排列)
- 1 0.99999的悖论_天文学科普:带你了解反物质、费米悖论和黑洞
- NeuroImage:暴力的隐式创伤—异常运动振荡脑活动与创伤后应激症状有关
- Shell语言-16-Shell脚本调试 -n -v -x -c
- 小程序实现轮播图跳转页面和小程序
- matlab的一点内容
- The day that you see me old-当我日渐老去的时候
- java 支付宝 第三方即时到账支付 接口
热门文章
- ThinkpadE550升级固态硬盘和内存
- golang,OpenGL,计算机图形学(一)
- tinyCTF 2014 tt3441810
- HTML CSS JavaScript网页制作从入门到精通 第3版 (刘西杰) pdf完整版
- mip网站添加快商通链接实现来路轨迹显示
- java基于SpringBoot+Vue+nodejs的在线外卖订餐系统Element
- 怎么把视频倒放,用最简单的方法实现最佳效果
- 进制转化:从键盘接收一个4位的十进制数,将它转化为16进制并输出
- background-image 背景图片的设置
- JS RPC-sekiro直接得到加密参数结果进行爬虫(同花顺)