如何对接支付宝支付接口,已当面付为例
2022-08-04 20:30:52 1157浏览
1.申请支付接口
需要个人资料在支付包后台申请开通,才能拿到公钥秘钥等参数,这里省略,主要讲解Java如何接入支付宝扫码支付
2.查看支付宝api
https://opensupport.alipay.com/support/helpcenter/99

下载demo


解压,将demo导入eclipse或者idea,也可大致看一下支付宝给的文档

3.修改配置文件zfbinfo.properties
这些参数是第一步中你在支付宝平台申请的参数哦,调试接口很简单,不成功的绝大部分原因都是参数配置的不对导致。

4.查看Main.java
这个类主要写了支付二维码,退款,查询订单等接口,可以直接修改封装集成到自己的项目,我们先调试通这个demo.支付宝已经写了很多注释了,请认真查看

常用的接口:生成支付二维码,和退款接口
已调试当面付二维码为例
查看 test_trade_precreate方法需要修改两个地方:
1.二维码磁盘路径
2.将二维码存入磁盘(这样做是为了好理解,实际开发中不需要存入磁盘)

执行main函数

去D盘查看二维码

支付宝扫一扫

已经可以支付了
这说明配置文件的参数没问题。
5.发布项目


具体请自己运行查看
6、如何接入自己的项目,以有偿问答为例
6.1接入支付二维码接口
前面说了Main.java里的代码,其实人家已经封装好了,我们只需要复制自己需要的部分,以及传入需要的参数二重新封装成自己的支付接口
GFAlipay.java
如下:

这里传入的是订单名称body,订单号tradeno,总金额total,支付成功后的回调地址

三点需要注意(微信二维码接入支付的流程也是如此):
(1)回掉地址需要是外网ip加你的接口(servlet或者controller都可以,内容是一样的)
(2)不用产生磁盘二维码,避免资源浪费
(3)将支付参数QrCode传给前台,利用qrcode.min.js产生二维码
以上已网站网页为主
当前台用户需要支付时利用ajax请求自己的支付controller即可
调用自己封装的支付接口,注意此时需要产生一个待支付的订单,比如为支付状态为0

把qrcode传给前台,然后利用qrcode.min.js生成二维码如下:
new QRCode(document.getElementById("wx_pay_qr"), data.qrcode);//wx_pay_qr是页面的一个id为wx_pay_qr的div,用来显示二维码的
注意默认二维码有效期为两分钟,也可自行设置时长
这时页面已经产生了一个待支付的二维码
6.2支付以后的回调接口
demo里只是给了支付的用法,并没有给回调的逻辑,先搞懂几个问题。
1)为啥需要回调?
首先是我们的程序调用阿里服务器的支付接口产生了待支付二维码,那么用户支付成功之后,我们怎么能知道了呢?所以我们需要写一个对外的接口让阿里请求,这样我们的程序就知道了用户已支付。 代码如下:(注意:根据支付宝给的订单号来查询是哪个订单支付了,需要判断订单在的状态,避免产生重复且有可能错误的数据)
@WebServlet("/xxx.do")
public class AlipayNotifyxxxxxxServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Autowired
private xxx xxx;
/**
* @see HttpServlet#HttpServlet()
*/
public AlipayNotifyServlet_goldcoin() {
super();
}
private ExecutorService executorService = Executors.newFixedThreadPool(20);
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
response.setHeader( "Content-type", "text/html;charset=UTF-8" );
try{
Map<String, String> map = convertRequestParamsToMap(request); // 将异步通知中收到的待验证所有参数都存放到map中
System.out.println("==问答=支付宝扫码回调=购买金币======================================");
System.out.println(map);
System.out.println("---------------------<br><br>");
String trade_status=map.get("trade_status");
System.out.println(trade_status);
String out_trade_no=map.get("out_trade_no");//我们自己的订单号
String app_id=map.get("app_id");
String seller_id=map.get("seller_id");
if(trade_status.equals("TRADE_SUCCESS")&&app_id.equals("xxx")&&seller_id.equals("xxx")){
l.setType("支付宝扫码支付-购买金币");
//一下是你的业务逻辑,比如将这次的回调参数全部存入数据库等
根据订单号查询对应的订单等
//在用户请求成功后,支付包在几秒内请求该接口好几次(网络的原因延迟等,比如你去敲门,第一次没人回答,可能是人家没听到,你是不是会在敲几次呢)
if(判断该订单未支付){
//修改订单状态为已支付,还有你的其他业务逻辑,比如给用户添加金币数量等,如果不判断支付状态,那有可能
//用户直充了一次钱,程序却给他加了好几次的金币
//返回success是在告诉支付宝,我接收到你的回调了,你不用在请求我了(你敲门之后有人回答了,你就不用继续敲门了)
response.getWriter().write("success");
response.getWriter().close();
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
// 将request中的参数转换成Map
private static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {
Map<String, String> retMap = new HashMap<String, String>();
Set<Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
for (Entry<String, String[]> entry : entrySet) {
String name = entry.getKey();
String[] values = entry.getValue();
int valLen = values.length;
if (valLen == 1) {
retMap.put(name, values[0]);
} else if (valLen > 1) {
StringBuilder sb = new StringBuilder();
for (String val : values) {
sb.append(",").append(val);
}
retMap.put(name, sb.toString().substring(1));
} else {
retMap.put(name, "");
}
}
return retMap;
}
}
2)回调后前端页面怎么监听?
上面是修改了数据库里的支付状态,但是现在前台用户的页面还是停留在有二维码的页面,这样用户会很懵啊。其实也很简单,这里使用ajax轮询的方法来监听用户是否支付成功并跳转页面。
当然还有其他的更好地方法,此处以轮询为主
前台在产生二维码后启用计时每隔几秒发送ajax请求该订单的支付状态,如果支付状态变成已支付,则跳转支付成功的页面即可。如果用户关闭字符弹框,可以清除计时器,具体以你的代码功能为主
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论


新业务
springboot学习
ssm框架课
vue学习
【带小白】java基础速成