点击上方[全栈开发者社区]右上角[...][设为星标⭐]

场景

最近在做支付宝的接口对接,之前做过一个版本,但是由于申请了新的账号以前旧的的接口对接就不能使用了
所以就开始对接新的版本接口对接,在这里也记录一下让那些还没有对接的兄弟少走点弯路。

准备

先申请一个企业账户

https://memberprod.alipay.com/account/reg/enterpriseIndex.htm

创建应用

去支付宝的开放平台

https://open.alipay.com/platform/home.htm

添加应用:

https://docs.open.alipay.com/200/105310

按照这个链接的文档一步一步操作;

账号准备好之后,就可以了解相关的接口了,以(即时到账)支付接口为例。

阅读接口文档

https://docs.open.alipay.com/270/alipay.trade.page.pay/

下载SDK

https://docs.open.alipay.com/54/103419

选择java版本

将sdk集成进入项目中

sdk中有一个jar包

将这个jar包上传到私服上去。

参考这个:

http://blog.csdn.net/huchunlinnk/article/details/17789175

项目引入sdk中的关键jar包

这里的gav的写法取决于你上传私服的时候的填写

<dependency><groupId>com.alipay</groupId><artifactId>alipay-api</artifactId><version>1.0.0</version>
</dependency>

处理AlipayConfig对象

取消AlipayConfig配置文件中的部分常量

打开下载sdk应该可以找到

将这个类中的前几个静态常量变成非静态的,以便可以支持多个配置对象。

/* **类名:AlipayConfig*功能:基础配置类*详细:设置帐户有关信息及返回路径*修改日期:2017-04-05*说明:*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。*/
@Data
public class AlipayConfig {//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号public String app_id = "";// 商户私钥,您的PKCS8格式RSA2私钥public String merchant_private_key = "";// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。public String alipay_public_key = "";// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public String notify_url = "";// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public String return_url = "";// 签名方式public static String sign_type = "RSA2";// 字符编码格式public static String charset = "utf-8";// 支付宝网关public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";//日志路径public static String log_path = "C:\\";
}

编写请求支付的接口

后端向支付宝发起支付的请求,在这个同时需要传递必要参数,下面我们就来编写如何向支付宝发起支付。

编写conroller层

/*** 阿里支付控制器** @author   WangSen(wangsenhehe@126.com)* @Date     2017年8月16日      */
@Controller
@RequestMapping("/alipay")
public class AliPayController {@Autowiredprivate AlipayViewService alipayViewService;/*** 跳转到去支付的jsp页面** @param orderId 订单号* * @param payAccountType 支付账号类型* * @param model 模型* * @throws Exception*/@RequestMappingpublic void gotopay(long orderId, Model model) throws Exception {alipayViewService.setGoToPayInfo(orderId, model);}
}

编写viewService层

/*** 阿里支付页面服务类* * @author   WangSen(wangsenhehe@126.com)* @Date     2017年8月16日      */
@Service
public class AlipayViewService {@Autowiredprivate NewAlipayBusinessService newAlipayBusinessService;/*** 设置去支付信息* * @param orderId 订单id* @param model 模型* @param payAccountType 支付账号类型* * @return 构建的字符串*/public void setGoToPayInfo(long orderId, Model model) throws Exception {model.addAttribute("htmlStr", newAlipayBusinessService.buildPayRequest(orderId, payPrice, "报名费", "略"));}
}

编写service层

/*** 新的阿里支付页面服务类* <p>* 阿里升级接口之后使用这个服务类* * @author   WangSen(wangsenhehe@126.com)* @Date     2017年8月16日      */
@Data
public class NewAlipayBusinessService {/*** 阿里的配置文件对象*/private AlipayConfig alipayConfig;/*** 构建支付请求** @param orderId 订单号* @param payPrice 付款金额* @param orderName 订单名称* @param body 商品描述* * @return html字符串*/public String buildPayRequest(long orderId, long payPrice, String orderName, String body) throws Exception {//获得初始化的AlipayClientAlipayClient alipayClient = getAlipayClient();//设置请求参数String bizContent = getBizContent(ConvertUtil.obj2str(orderId), AmountUtils.changeF2Y(payPrice), orderName,body);return alipayClient.pageExecute(setAlipayRequestParameters(bizContent)).getBody();}/*** 设置阿里支付请求参数** @param bizContent 包含关键参数的json字符串* * @return AlipayTradePagePayRequest对象*/private AlipayTradePagePayRequest setAlipayRequestParameters(String bizContent) {AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(alipayConfig.getReturn_url());alipayRequest.setNotifyUrl(alipayConfig.getNotify_url());alipayRequest.setBizContent(bizContent);return alipayRequest;}private AlipayClient getAlipayClient() {AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, alipayConfig.getApp_id(),alipayConfig.getMerchant_private_key(), "json", AlipayConfig.charset,alipayConfig.getAlipay_public_key(), AlipayConfig.sign_type);return alipayClient;}/*** 获取业务的关键内容** @param out_trade_no 订单号* @param total_amount 付款金额* @param subject 订单名称* @param body 商品描述* * @return 拼接之后的json字符串*/private String getBizContent(String out_trade_no, String total_amount, String subject, String body) {ExceptionUtil.checkEmpty(out_trade_no, "订单号不能为空");ExceptionUtil.checkEmpty(total_amount, "价格不能为空");ExceptionUtil.checkEmpty(subject, "订单名称不能为空");ExceptionUtil.checkEmpty(body, "商品描述不能为空");StringBuffer sb = new StringBuffer();sb.append("{");sb.append("\"out_trade_no\":\"").append(out_trade_no).append("\",");sb.append("\"total_amount\":\"").append(total_amount).append("\",");sb.append("\"subject\":\"").append(subject).append("\",");sb.append("\"body\":\"").append(body).append("\",");sb.append("\"product_code\":\"FAST_INSTANT_TRADE_PAY\"");sb.append("}");return sb.toString();}}

通过xml文件配置支付对象

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"><!-- 数理化支付配置对象 --><bean id="alipayConfig" class="com.we.business.pay.newalipay.config.AlipayConfig"><property name="app_id" value="你的appId"/><property name="merchant_private_key" value="你的私钥"/><property name="alipay_public_key" value="支付宝公钥"/><property name="notify_url" value="支付完成的异步通知地址"/><property name="return_url" value="支付完成跳转的地址"/></bean><!-- 阿里支付业务服务类 --><bean id="newAlipayBusinessService" class="com.we.business.pay.service.NewAlipayBusinessService"><property name="alipayConfig" ref="alipayConfig"/></bean>
</beans>

编写jsp页面

<%@page import="com.we.core.common.util.DateTimeUtil"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>支付宝即时到账交易接口</title></head>${htmlStr }<body></body>
</html>

测试

页面访问:

localhost:8091/alipay/gotopay.json?orderId=232323

就可以看到支付页面了;

编写支付的异步通知接口

用户支付完成之后支付宝会通过你配置的的notify_url的值进行回调,

我需要编写这个逻辑,以完成整个的支付流程。

编写controller层

/*** 阿里支付控制器** @author   WangSen(wangsenhehe@126.com)* @Date     2017年8月16日      */
@Controller
@RequestMapping("/alipay")
public class AliPayController {@Autowiredprivate AlipayViewService alipayViewService;/*** 支付完成*/@Void@NotSso@ResponseBody@RequestMappingpublic void payFinish() throws Exception {alipayViewService.payFinish();}
}

编写viewService层

/*** 阿里支付页面服务类* * @author   WangSen(wangsenhehe@126.com)* @Date     2017年8月16日      */
@Service
public class AlipayViewService {@Autowiredprivate NewAlipayBusinessService newAlipayBusinessService;/*** 支付完成** @throws IOException io异常*/public void payFinish() throws Exception {newAlipayBusinessService.payFinish();}
}

编写处理支付完成的servie

/*** 新的阿里支付页面服务类* <p>* 阿里升级接口之后使用这个服务类* * @author   WangSen(wangsenhehe@126.com)* @Date     2017年8月16日      */
@Data
public class NewAlipayBusinessService {/*** 阿里的配置文件对象*/private AlipayConfig alipayConfig;/*** 支付完成** @throws Exception 异常对象*/public void payFinish() throws Exception {HttpServletRequest request = MvcUtil.getRequest();PrintWriter out = MvcUtil.getResponse().getWriter();//获取支付宝POST过来反馈信息Map<String, String> params = getParames(request);if (!isSuccess(params)) {fail(out);return;}long orderId = getOrderId(params);long payPrice = getTotalFee(params);try {//编辑你支付完成之后的逻辑success(out);} catch (Exception e) {fail(out);}}/*** 获取订单id** @param params 请求参数  * @return 订单id*/private long getOrderId(Map<String, String> params) {String order_no = params.get("out_trade_no");return ConvertUtil.obj2long(order_no);}/*** 获取总金额** @param params 请求参数* @return 总金额*/private long getTotalFee(Map<String, String> params) {String total_fee = params.get("total_amount");return ConvertUtil.obj2long(AmountUtils.changeY2F(total_fee));}/*** 校验支付宝支付是否成功** @param params http请求* @return 成功即为真* @throws AlipayApiException */private boolean isSuccess(final Map<String, String> params) throws AlipayApiException {boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipay_public_key(),AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名if (!signVerified) {return false;}//交易状态String trade_status = params.get("trade_status");if (!trade_status.equals("TRADE_FINISHED") && !trade_status.equals("TRADE_SUCCESS")) {return false;}return true;}/*** 成功** TODO 重构方法名* @param out 输出流*/private void success(PrintWriter out) {out.println("success");}/*** 失败** TODO 重构方法名* @param out 输出流*/private void fail(PrintWriter out) {out.println("fail");}/*** 获取参数** @param request HttpServletRequest对象* * @return 返回支付宝携带的参数*/private Map<String, String> getParames(HttpServletRequest request) {Map<String, String> params = new HashMap<String, String>();@SuppressWarnings("unchecked")Map<String, String[]> requestParams = request.getParameterMap();for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {String name = ConvertUtil.obj2str(iter.next());@SuppressWarnings("cast")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] + ",";}//乱码解决,这段代码在出现乱码时使用//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}return params;}
}

做的过程可能用到的资源

支付接口以及异步通知接口的参数详解:
https://docs.open.alipay.com/270/105902/
生成公钥私钥的步骤:
https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1
服务端的sdk:
https://docs.open.alipay.com/203/105910
即时到账新老版本接口对比:
https://docs.open.alipay.com/270/106759

觉得本文对你有帮助?请分享给更多人关注「全栈开发者社区」加星标,提升全栈技能
本公众号会不定期给大家发福利,包括送书、学习资源等,敬请期待吧!
如果感觉推送内容不错,不妨右下角点个在看转发朋友圈或收藏,感谢支持。
好文章,留言、点赞、在看和分享一条龙吧❤️

一文教你如何对接【支付宝】支付接口,网友:666啊!相关推荐

  1. PHP版本对接支付宝支付接口 电脑网站 详细介绍 沙箱环境 超简单易懂

    PHP版本对接支付宝支付接口 其实理顺了思路后,按照我接下来的步骤来,真的超级简单啊,为啥有那么多的朋友们折腾了那么久呢,嘿嘿,接下来跟我走吧~ 我是昨天晚上洗完澡之后,大概八九点,才开始正式开工尝试 ...

  2. android支付功能开发,对接支付宝支付接口开发详细步骤

    对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧. 第一步:(先要在支付宝进行操做 ...

  3. 订单支付功能对接支付宝支付接口

    求助:这张GIF的效果动图整了一个多小时,没找到好的编辑软件,都太难用了.如果恰巧看到这篇文章有好的GIF编辑或者录制软件,请推荐一 个!万谢 订单支付功能是购物的最后一个环节,本文将通过对接支付宝的 ...

  4. 支付宝html5接入,app和h5怎样对接支付宝支付接口?

    1.支付宝开放平台https://open.alipay.com 新增应用并签约手机网站支付/APP支付. 2.服务端使用java, 集成支付宝sdk. 3.为方便以后更多支付方式扩展, 先定义接口, ...

  5. TP5 对接支付宝支付接口开发详细步骤(证书签名方式)

    注: 支付宝支付分为支付宝公钥和证书签名方式两种,如果需要使用退款功能要用证书签名方式开发 php接入支付宝证书方式签名 支付宝 PHP SDK 分为老版和新版,老版本的 PHP SDK(v3.4.2 ...

  6. 对接支付宝支付接口开发详细步骤

    之前做web项目接入支付宝,网上看了很多文档和案列,不是不讲重点就是过时不适用了,导致走了很多弯路,经过冷静分析总算跑通了,这里分享下接入流程. 第一步:(先要在支付宝进行操做,拿到我们需要开发的信息 ...

  7. jsp对接支付宝支付接口,实现网站在线支付(JSP/JAVA WEB/Servlet)

    首先登录 支付宝开放平台 点击立即入驻 打开手机支付宝扫码登录,登录后会提示填写相关信息,填完之后就算入驻成功了. 说明,由于我没有 企业账号,所以以下的操作全在沙箱中进行. 接着,点击开发者中心,选 ...

  8. 支付宝支付接口对接的总结

    本周工作最大的困难还是支付宝支付接口的对接. 遇到主要的问题是两个:1. 发送订单给支付宝接口,接口验证签名失败. 2.支付宝付款结束后,发送信息给网站接收方进行二次验签,还是签名过不了.验签的方式是 ...

  9. java 对接支付宝支付

    2019独角兽企业重金招聘Python工程师标准>>> 对接支付宝支付的前提: 1,商户开通支付能力 登录蚂蚁金服 开放平台:https://open.alipay.com/plat ...

  10. JAVA对接支付宝支付(超详细,一看就懂)

    Java对接支付宝支付 更多内容 冷文博客: 传送门 引入 为什么要发这篇帖子呢?原因很简单,就是因为在一个稍稍正规一点的应用上都会有支付这个环节,我们日常的在线支付如今包括支付宝,微信钱包,QQ钱包 ...

最新文章

  1. 瓶框(bottle)架学习之模版使用
  2. 使用WebDriver + Java + Junit做自动化测试教程
  3. Canal安装说明(Windows版)
  4. python菜鸟excel教程-Python菜鸟之路: 封装通用excel操作
  5. 最短工期 (25 分)【拓扑排序模板】
  6. 青海行--(7月26日)翻越祁连山
  7. Win8 64位系统最简单的adb安装方法
  8. android系统功耗问题:systrace
  9. masm for windows2015 下载安装
  10. 如何将macOS应用程序打包为dmg文件
  11. 十进制转格雷码 c语言,C语言输出格雷码
  12. wpsmac和pc版的区别_Mac版WPS Office和微软Office 2019哪个更好?
  13. 软考中级网络工程师-第一章计算机网络概论(自我学习)
  14. 古体字与简体字对照表_简体字和繁体字对照表
  15. 在局域网被网络管理员限制了远程连接的默认端口3389,导致无法远程桌面连接
  16. 2021张家界五一出行攻略
  17. html定义子菜单初始为隐藏,需要静心学习的PbootCMS模板制作教程(五)
  18. Android 获取当前IP地址
  19. 判断图有无环_数读湾区经济潜能:基于大数据分析的环杭州湾大湾区“一体化”发展潜能!...
  20. js动态加载table,打印table里的内容以及解决打印后的问题

热门文章

  1. 高德地图获取经纬度并逆定位获取地理位置名称(原生)
  2. 【洛谷1137】旅行计划【拓扑排序模板】
  3. 我用Python分析1585家电商车厘子销售数据,发现这些秘密
  4. scrapy-redis 和 scrapy-splash结合 做分布式渲染爬取
  5. python日历程序编写_Python创建日历实例
  6. [bzoj3812]主旋律
  7. 动态IP和静态IP区别,别傻傻分不清楚!
  8. 开源开放 | OpenKG发布cnSchema重构版本
  9. 最大报销额(01背包)
  10. 计算机一级两列怎么筛选,怎么筛选Excel软件两个表格里相同的数据