官方文档

支付接口(alipay.trade.page.pay):

  1. 商户系统请求支付宝接口alipay.trade.page.pay,支付宝对商户请求参数进行校验,而后重定向至用户登录页面。
  2. 用户确认支付后,支付宝get请求returnUrl(商户入参传入),返回同步返回参数。
    交易成功后,支付宝post请求notifyUrl(商户入参传入),返回异步通知参数。
  3. 若由于网络等问题异步通知没有到达,商户可自行调用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工具使用穿透到外网,官方的沙箱也很好用:支付宝沙箱使用

支付宝支付-电脑网站支付相关推荐

  1. php支付宝系列之电脑网站支付,一个PHP文件搞定支付宝之电脑网站支付

    本篇文章给大家分享的内容是关于用一个PHP文件搞定支付宝之电脑网站支付 ,有需要的朋友可以参考一下 网上的很多PHP支付宝支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文 ...

  2. SpringBoot整合支付宝之电脑网站支付

    SpringBoot整合支付宝之电脑网站支付 一.支付宝介绍 1.2 过程分析 1.3 对接支付宝的准备工作 1.4 申请步骤: 2.支付功能实现 2.1 思路分析 2.2 编写支付宝支付接口 2.2 ...

  3. 支付宝支付 - 电脑网站支付

    目录 1. 支付宝支付 - 配置 2. 支付宝支付 - 电脑网站支付 一.引用dll 二.发起支付 /// <summary> /// 支付 /// </summary> // ...

  4. PHP开发支付宝之电脑网站支付--流程简介

    前言 前端时间自己开发了一个drupal的支付宝模块,现在整理一下过程,因为支付宝官方网站提供的接口及文档都是新接口的,而且使用新接口的过程比较麻烦一点,所以整理一下 1.支付宝的账号必须经过企业资格 ...

  5. 支付宝系列-电脑网站支付

    1.概念 电脑网站支付,也称扫码支付,是专门针对PC端业务而开发的一种支付方式,既有支付宝提供在网页展示一个动态生成的支付二维码,用户通过手机支付宝扫码以后可实现支付功能的一种支付方式. 2.创建应用 ...

  6. 支付宝支付-电脑网站支付开发

    公司产品需要做一个订单系统,需要在线下单支付功能,由于时间紧,任务重,选择了阿里的电脑网站支付作为支付的手段接入.一定要区分阿里的扫码支付和电脑网站支付的区别,刚开始我就搞混了.网站支付的页面类似于下 ...

  7. Java之支付宝支付(电脑网站支付)沙箱测试版

    支付宝支付流程及注意事项(沙箱测试版) 一:支付宝支付接入准备工作: 首先,支付宝支付和微信支付意愿,都是只支持企业用户,个人用户是不能接入支付宝支付的,所以要想接入支付宝支付,首先需要有支付宝的企业 ...

  8. 支付宝之电脑网站支付(保姆版)

      大家好,我是大史兄弟,一个不断摸索爬行的程序员.看CSND文章已经有好多年了,但是写文章还是第一次.我不是行业的大牛,只是一个希望不断进步成为大牛的小白程序员.   不知道有没有和我一样情况的,学 ...

  9. 接入支付宝电脑网站支付实现JAVA版

    简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址,因为我这些服务天天在更新,而我的文章是教大家方法,而让你不是照葫芦画瓢 ...

最新文章

  1. python笔记day4
  2. 读书笔记6pandas简单使用
  3. LINUX任务(jobs)详解
  4. Edge好用么?几条你不知道的Edge小技巧
  5. Hibernate框架ORM的实现原理-不是技术的技术
  6. 思科决定将不修复路由器中的这70多个漏洞
  7. 死磕 java同步系列之AQS起篇
  8. 1042 cant get hostname for your address
  9. 自定义表单-列表字段的数据源绑定
  10. Linux上screen命令如何安装,Linux screen命令,Linux screen用法,Linux screen简单用法,Linux screen安装...
  11. oracle应收模块报表,OracleERPEBS应收模块AR概要培训ppt课件
  12. jQuery——常用API
  13. 桥本分数式(用递归法实现全排列)
  14. 1 0.99999的悖论_天文学科普:带你了解反物质、费米悖论和黑洞
  15. NeuroImage:暴力的隐式创伤—异常运动振荡脑活动与创伤后应激症状有关
  16. Shell语言-16-Shell脚本调试 -n -v -x -c
  17. 小程序实现轮播图跳转页面和小程序
  18. matlab的一点内容
  19. The day that you see me old-当我日渐老去的时候
  20. java 支付宝 第三方即时到账支付 接口

热门文章

  1. ThinkpadE550升级固态硬盘和内存
  2. golang,OpenGL,计算机图形学(一)
  3. tinyCTF 2014 tt3441810
  4. HTML CSS JavaScript网页制作从入门到精通 第3版 (刘西杰) pdf完整版
  5. mip网站添加快商通链接实现来路轨迹显示
  6. java基于SpringBoot+Vue+nodejs的在线外卖订餐系统Element
  7. 怎么把视频倒放,用最简单的方法实现最佳效果
  8. 进制转化:从键盘接收一个4位的十进制数,将它转化为16进制并输出
  9. background-image 背景图片的设置
  10. JS RPC-sekiro直接得到加密参数结果进行爬虫(同花顺)