如何对接支付宝支付接口,已当面付为例
2022-08-04 20:30:52 537浏览
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)展开评论
展开评论