如何对接支付宝支付接口,已当面付为例

如何对接支付宝支付接口,已当面付为例-飞一样的编程
飞一样的编程
擅长邻域:Java,MySQL,Linux,nginx,springboot,mongodb,微信小程序,vue

2022-08-04 20:30:52   69浏览 分类: Java

1.申请支付接口

 需要个人资料在支付包后台申请开通,才能拿到公钥秘钥等参数,这里省略,主要讲解Java如何接入支付宝扫码支付

2.查看支付宝api

 https://opensupport.alipay.com/support/helpcenter/99

 

image.png

下载demo

 

image.png

image.png

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

image.png

3.修改配置文件zfbinfo.properties

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

image.png

4.查看Main.java

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

image.png


常用的接口:生成支付二维码,和退款接口

已调试当面付二维码为例

查看 test_trade_precreate方法需要修改两个地方:

1.二维码磁盘路径

2.将二维码存入磁盘(这样做是为了好理解,实际开发中不需要存入磁盘)

image.png


执行main函数

image.png


去D盘查看二维码

image.png

支付宝扫一扫

image.png

已经可以支付了

这说明配置文件的参数没问题。

5.发布项目

image.png

image.png

具体请自己运行查看

6、如何接入自己的项目,以有偿问答为例

6.1接入支付二维码接口

前面说了Main.java里的代码,其实人家已经封装好了,我们只需要复制自己需要的部分,以及传入需要的参数二重新封装成自己的支付接口

GFAlipay.java

如下:

image.png

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


image.png

三点需要注意(微信二维码接入支付的流程也是如此):

(1)回掉地址需要是外网ip加你的接口(servlet或者controller都可以,内容是一样的)

(2)不用产生磁盘二维码,避免资源浪费

(3)将支付参数QrCode传给前台,利用qrcode.min.js产生二维码

以上已网站网页为主

当前台用户需要支付时利用ajax请求自己的支付controller即可

调用自己封装的支付接口,注意此时需要产生一个待支付的订单,比如为支付状态为0

image.png

把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

暂无评论,快来写一下吧
客服QQ 1913284695