本文介绍: java对接支付宝当面付功能实现网站在下支付实时查询支付结果全套教程C/V即可

最近看到很多人想用java写支付宝的收款功能用来做网站支付,

个人感觉网站支付的话支付宝的当面付功能算是有简单又实用的

当面付功能只需要实现他的两个接口就可以完成网站的支付和结果校验

1.支付宝的预创建订单—-改接口实现后可以做到返回二维码的连接通过返回来的连接去生成二维码即可

我这里用springboot项目来演示

首先创建springboot项目完成项目结构的搭建

接下来第一步:引入支付宝提供的SDK

引入SDK后即可进行编码

首先创建一个当面付德工具类—-将交易与创建功能和订单支付结果查询功能写在里面

引入maven

<!--支付宝当面付SDK        -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.34.52.ALL</version>
</dependency>

 交易预创建和订单支付状态查询

public class PayCreatutil {
//订单预创建方法  返回值类型为Map 或者List都可        接收参数为订单实体类
    public Map<String,String> AlipayTradePrecreate(goods goods) throws AlipayApiException {
        String privateKey = "这里写你的支付宝应用私钥";
        String alipayPublicKey = "这里是你的支付宝公钥";
        AlipayConfig alipayConfig = new AlipayConfig();
        //此处括号里参数为网关地址---使用的是沙箱测试环境的网关
        alipayConfig.setServerUrl("https://openapi.alipaydev.com/gateway.do");
        alipayConfig.setAppId("此处参数为支付宝的APPID可在支付宝开发者中心查找");
        alipayConfig.setPrivateKey(privateKey);
        alipayConfig.setFormat("json");
        alipayConfig.setAlipayPublicKey(alipayPublicKey);
        alipayConfig.setCharset("UTF8");
        //设置加密方式要与你支付宝生成秘钥时的方式一样RSA2或者RSA
        alipayConfig.setSignType("RSA2");
        AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
        log.info("外部订单号是{}",goods.getOutTradeNo());
        model.setOutTradeNo(goods.getOutTradeNo());
        model.setTotalAmount(goods.getTotalAmount());
        model.setSubject(goods.getSubject());
        //此处的参数为订单失效时间可不传递,默认为3小时  可选值1-60m 1-12h      ---m分钟h小时
        model.setTimeoutExpress("3m");
        request.setBizModel(model);
        AlipayTradePrecreateResponse response = alipayClient.execute(request);
        System.out.println(response.getBody());
        Map map = new HashMap();
        if (response.isSuccess()) {
            //此处为设置返回数据-二维码连接 引用的第三方链接转二维码api各位也可以换成自己的或者其他转码api
            map.put("img","https://api.isoyu.com/qr/?m=0&e=L&p=10&url="+response.getQrCode());
            map.put("No",goods.getOutTradeNo());
            log.info("返回的{}",goods.getOutTradeNo());
            System.out.println("调用成功");
            System.out.println(goods.getOutTradeNo());
            return  map;
        } else {
            System.out.println("调用失败");
        }
//        }
        return map;
    }


    //订单支付结果查询----和上面的创建方法基本一致
    public Map<String,String> AlipayTradeQuery(goods goods) throws AlipayApiException {
        String privateKey = "支付宝应用私钥";
        String alipayPublicKey = "支付宝公钥";
        AlipayConfig alipayConfig = new AlipayConfig();
        alipayConfig.setServerUrl("https://openapi.alipaydev.com/gateway.do");
        alipayConfig.setAppId("支付宝APPID");
        alipayConfig.setPrivateKey(privateKey);
        alipayConfig.setFormat("json");
        alipayConfig.setAlipayPublicKey(alipayPublicKey);
        alipayConfig.setCharset("UTF8");
        alipayConfig.setSignType("RSA2");
        AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        AlipayTradeQueryModel model = new AlipayTradeQueryModel();
        model.setOutTradeNo(goods.getOutTradeNo());
        request.setBizModel(model);
        AlipayTradeQueryResponse response = alipayClient.execute(request);
        System.out.println(response.getBody());
        Map map = new HashMap();
        if (response.isSuccess()) {
            System.out.println("调用成功");
            System.out.println(response.getTradeStatus());
            if (response.getTradeStatus().equals("TRADE_SUCCESS") && response.getBuyerPayAmount().equals(response.getTotalAmount())){
                map.put("status",response.getTradeStatus());
                return map;
            }
            map.put("status",response.getTradeStatus());
            return map;
        } else {
            System.out.println("调用失败");
        }
        map.put("status","查询失败");
        return map;
    }
}

接下来我们创建goods实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class goods {
    public String OutTradeNo;
    public String TotalAmount;
    public String Subject;
    public String outTradeNo;
}

controller层—创建两个访问接口

@RestController
@RequestMapping("/Pay")
@Slf4j
@CrossOrigin //解决跨域请求问题
public class PayController {
    PayCreatutil payCreatutil = new PayCreatutil();
    @PostMapping("/creatEWM")
    public Map<String,String> creatEWM(@RequestBody goods goods) throws AlipayApiException {
        return payCreatutil.AlipayTradePrecreate(goods);
    }
    @PostMapping("/queryresult")
    public Map<String,String> AlipayTradeQuery(@RequestBody goods goods) throws AlipayApiException {
        return payCreatutil.AlipayTradeQuery(goods);
    }

}

到这里后端就结束了

接下来我们写个简单地前端页面进行测试

<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>Title</title>
		<style>
			* {
				margin: 10px auto;
				text-align: center;
			}
		</style>
	</head>

	<body>
		<div>
			<h1 id=" qq">请输入测试信息</h1> 订单号:
			<input id="orderNo" type="text" /><br /> 订单金额:
			<input id="money" type="text" /><br /> 商品名称:
			<input id="name" type="text" /><br />
			<button id="creat" onclick="creatEWM()">提交</button><br />
			<!--<img  id="skm" src="" width="100px" height="100px"/>-->
			<div class="imgs"></div>
			<input type="hidden" id="h" />
		</div>

	</body>
	<!--<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>-->
	<script src="js/jquery.js"></script>
	<script>
		function creatEWM() {
			console.log("单击事件响应");
			var jsonn = {
				OutTradeNo: $("#orderNo").val(),
				TotalAmount: $("#money").val(),
				Subject: $("#name").val()
			};
			console.log($("#orderNo").val())
			var goods = JSON.stringify(jsonn)
			$.ajax({
				url: "http://localhost:8080/Pay/creatEWM", //后台请求的数据,用的是PHP
				dataType: "JSON", //数据格式
				contentType: "application/json",
				data: goods, //请求的数据
				type: "POST", //请求方式
				async: false, //是否异步请求
				success: function(data) { //如果请求成功,返回数据。
					var img = data.img;
					console.log(data.img);
					$('.imgs').html("<img src='" + img + "' width=150px height=150px/>");
					$('#h').val(data.No);

					console.log("调用时传递的No" + data.No);
				},
			});
			if($('#h').html() != "undefined" && $('#h').val() != "undefined" && $("#h").val().length > 0) {
				var aa = $("#h").attr("value")
				console.log("val是" + aa);
				getresult($('#h').val());
			}
		}

		function getresult(jsop) {
			console.log("前端接收时的No" + jsop)
			var jsom = {
				"OutTradeNo": jsop
			}
			var goods = JSON.stringify(jsom);
			console.log(goods.OutTradeNo);
			var eValue = eval('jsom.OutTradeNo');
			console.log(eValue);
			$.ajax({
				url: "http://localhost:8080/Pay/queryresult", //后台请求的数据,用的是PHP
				dataType: "JSON", //数据格式
				contentType: "application/json",
				data: goods, //请求的数据
				type: "POST", //请求方式
				async: true, //是否异步请求
				success: function(data) { //如果请求成功,返回数据。
					var status = data.status;
					console.log(data.status);
					if(status == "TRADE_SUCCESS") {
						alert("支付成功!!!");
						return;
					} else if(status == "WAIT_BUYER_PAY" || status == "查询失败") {
						console.log("结尾" + jsop);
						setInterval(getresult(eValue), 5 * 1000);
					}

				},
			});
		}
	</script>

</html>

记得修改jquery引入地址

这样我们就可以将项目跑起来测试了 

前端页面简陋一些主要测试功能

 

 

 实时查询订单状态实时响应返回结果过

原文地址:https://blog.csdn.net/weixin_59087982/article/details/129722533

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_50887.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注