11支付功能≠支付系统:微信&支付宝通用支付系统开发实战

支付的代码只需十行,项目的代码请查看https://github.com/TLR2019/xc-edu02

1 微信支付

1.1 下单生成二维码

二维码可以利用下图的请求参数生成(下图没有截全,详系参数可以查看https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1)。

利用参数生成二维码的算法已经有人做好了。可以借助best-pay-sdk(https://github.com/Pay-Group/best-pay-sdk)将参数转化成生成二维码图片所需的输入。

生成二维码的过程:

(1)给出商品信息:订单号,金额。

(2)选择支付类型:微信OR支付宝

@Override
	public PayResponse create(String orderId, BigDecimal amount, BestPayTypeEnum bestPayTypeEnum) {
		if(bestPayTypeEnum != BestPayTypeEnum.WXPAY_NATIVE && bestPayTypeEnum != BestPayTypeEnum.ALIPAY_PC){
			throw new RuntimeException("暂不支持的支付类型");
		}
		//写入数据库
		PayRequest request = new PayRequest();
		request.setOrderName("7841763-最好的支付sdk");
		request.setOrderId(orderId);
		request.setOrderAmount(amount.doubleValue());
		request.setPayTypeEnum(bestPayTypeEnum);
		PayResponse response = bestPayService.pay(request);
		return response;

	}

(3)配置微信支付的APPID,MchID和MchKey。不同类型需要的配置不同,详情可查看https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

	@Bean
	public BestPayService bestPayService() {
		//微信支付配置
		WxPayConfig wxPayConfig = new WxPayConfig();
		wxPayConfig.setAppId("wxd898fcb01713c658");
		wxPayConfig.setMchId("1483469312");
		wxPayConfig.setMchKey("098F6BCD4621D373CADE4E832627B4F6");
        bestPayService.setAliPayConfig(aliPayConfig);
		return bestPayService;
    }

(4)利用静态化网页(只需要读取二维码链接),显示二维码

<body>
<div id="myQrcode"></div>

<script src="https://cdn.bootcss.com/jquery/1.5.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery.qrcode/1.0/jquery.qrcode.min.js"></script>
<script>
    jQuery('#myQrcode').qrcode({
        text: "${codeUrl}"
    });
</script>
</body>

 

 1.2 扫码支付调用异步通知函数

 

(1)扫码支付

(2)异步通知函数

签名校验、金额校验并告知微信不要重复通知。

	/**
	 * 异步通知处理
	 *
	 * @param notifyData
	 */
	@Override
	public String asyncNotify(String notifyData) {
		//1. 签名检验
		PayResponse payResponse = bestPayService.asyncNotify(notifyData);
		//2. 金额校验(从数据库查订单)
		//3. 修改订单支付状态
		if (payResponse.getPayPlatformEnum() == BestPayPlatformEnum.WX) {
			//4. 告诉微信不要再通知了
			return "<xml>\n" +
					"  <return_code><![CDATA[SUCCESS]]></return_code>\n" +
					"  <return_msg><![CDATA[OK]]></return_msg>\n" +
					"</xml>";
		}else if (payResponse.getPayPlatformEnum() == BestPayPlatformEnum.ALIPAY) {
			return "success";
		}

		throw new RuntimeException("异步通知中错误的支付平台");
	}

不要重复通知:

2 支付宝支付 

2.1 下单生成二维码

生成二维码过程:

(1)给出商品信息:订单号,金额。

(2)选择支付类型:微信OR支付宝

/**
	 * 创建/发起支付
	 *
	 * @param orderId
	 * @param amount
	 */
	@Override
	public PayResponse create(String orderId, BigDecimal amount, BestPayTypeEnum bestPayTypeEnum) {
		if(bestPayTypeEnum != BestPayTypeEnum.WXPAY_NATIVE && bestPayTypeEnum != BestPayTypeEnum.ALIPAY_PC){
			throw new RuntimeException("暂不支持的支付类型");
		}
		//写入数据库
		PayRequest request = new PayRequest();
		request.setOrderName("7841763-最好的支付sdk");
		request.setOrderId(orderId);
		request.setOrderAmount(amount.doubleValue());
		request.setPayTypeEnum(bestPayTypeEnum);
		PayResponse response = bestPayService.pay(request);
		return response;

	}

(3)配置支付宝

公众账号ID AppId,私钥,公钥,通知URL 以及支付成功后跳转的页面。


	@Bean
	public BestPayService bestPayService() {
		//微信支付配置
		WxPayConfig wxPayConfig = new WxPayConfig();
		wxPayConfig.setAppId("wxd898fcb01713c658");
		wxPayConfig.setMchId("1483469312");
		wxPayConfig.setMchKey("098F6BCD4621D373CADE4E832627B4F6");
		//192.168.50.101 同一局域网可访问
		//125.121.56.227 云服务器可行,家庭宽带不行(路由器、光猫)
		wxPayConfig.setNotifyUrl("http://namei.natapp1.cc/pay/notify");
		AliPayConfig aliPayConfig = new AliPayConfig();
		aliPayConfig.setAppId("2018062960540016");
		aliPayConfig.setPrivateKey("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCC/tk1oqymli5HpP9MxOkNofKkON1a6EqKg/S0++mZoKLInLasLkNuz0F8nSg/nBZGMv8XcIOXeOsK1ZT9tibxlgzun22lnBpHLueCAZlqITx33XO8SwiVULar2NIVFJwuUdvHPf/2Wj361cTd+zw+uJTPy3vIBljeOHDajzqBg9m5JrCIOgUze+4MZBT5/74gwwwpMDhRHRfR+4FTFmxqqzbTBGaFv4gCLSRB/3VpuruAP5AKCTR2ATHXgFO9veCemNwx5sI3F9Tw43+16xzAZh2T/6Xb3d31H9k31h9Iai7t2s00qY6eKsFpdi4ySK5qB2G9lbFvbpBv+3gz/5UFAgMBAAECggEANWn7Yc5yPf8w4c/atg/4w7FMgkAZqm7brj1+M6ogp58DoW+dYPoATxe9qTVf6wgXYQp8T692SPZqSOGsPgPfP1Ui8s4ZZJURdgMfLTi/uLHSuUGYZqfl2RSvV8UybJwZzx1b05NpYqeLbFNsUeOWvjB/pXdggsBrzjkPc19ByPtERzjiEFzvxGdYPDdvgNUmvbQj647X8umdyDAcNAbd8rkSQW87zBT12OQ/i/QR74BBg4VBJqTg9APk9mdVNufvxMwi9+lyGsGRFdnjmPCLHJvnT3Nh9KSHWuLrOeUjkGVEozd40iz/8LVwr+BZNeL6EjtZ3ztfphnIl92lMFNhQQKBgQDlm0t5N0REM0al/L0BygkwLsHHvAmjYhzjDJeooLgH0NyYYP/ruqqF6oPxDDaw17pciEypyOdoQ1JFaw9Uq41PfZlqL74PehSD3KWe7pPzlWIukaDq1aPit/pox92+ZO0lqwHQa80Tf1PO55xAVJQPltrhScnAmZiVIG1TD9z+sQKBgQCSDbGW2lVx5b9s1R0l8SRvoHQc83iIIyqx/+UJEEwxEMwSJ4ygAfUPcrJOYs2gOB9Ny08xqtNEQKlghwgwFqIec705AiU67Bw3TjWHnxgzvhzLPCrty/yJbWMmpXDjMm/VvwASkBL6pijjh/GUrRsJvh0McgWkDIg8OgIRu5rYlQKBgQChJ+nGb7sTn2XT9Vv4GIVwczEB7wJY0fFyj5EXA4+HtNpQfazDGOa9TchD9Q2h/BjK/8PHW8LIVJA3NxiwliR+CasXc+ET3dzuXH1G2y+vRUd/ZimrCj6YUAeLadVC4HXu/WMtlayAJdt+GuR55qNxebGxdOgNrgEBkpwJM9YqUQKBgCvFcNit/HeTDEiYohCx8WKG6uWWTiQ2reAEueZ6fOsjhpVWRv3ZOFF15Vw6njeLOk59RPG0qXZGDr0AGwMWdWW8+BOyweejxV0J0l8f3gf7zPNXx+HWhYvGPbXiVS+x+PRNNr9ZcGawD4cJQex16KmF0XzeWzRsERRDqkUYPXL1AoGBAJVzao5Irdt0wj/R8NG3uVeEMbESNLKNLZ7M9hPaZn2xacoPHXXLKg2m546RYNOngYLB5l9dbpake5BoXtuGylmtD1tZvGSxLmznfrxQpZr0vuR2iCIgsVGdPhJlIRbKyeocofsRdaXgD413O4MCi/WmJ4E1ydyOqv+2cCQQAJBB");
		aliPayConfig.setAliPayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtojdtkETo4OEsQLeyyPwtWK9ZqYJANq6jjXC74vk9n/r88yW577y7VdxcK9X/F/wvR7D8of7lndYdhg6xZro0eO2skPZTU+A549J7tfzahVbIBAS+x1WPFJwPtVrfBBvkwHL8PT+YnMcxKyBxOa6wo8fzJs1NgU1+qnDCpwUFyv59GUfdzBvTPL1fY3ZzvRHFHbapevVltbO/jNV0thb8dafmcJXl8lnjQy3XlH3eTH28tlVfqickacfRl/WSD8WN3dGgF7dTDKYfSR7YB7jsHe6VzoHM3UnD9/yQbi/Z3ZrL7yOxEjq4tfrKlZIW7ZCoUpOU4QdPIRhLeC6nWyGrQIDAQAB");
		aliPayConfig.setNotifyUrl("http://namei.natapp1.cc/pay/notify");
		aliPayConfig.setReturnUrl("http://127.0.0.1");

		BestPayServiceImpl bestPayService = new BestPayServiceImpl();
		bestPayService.setWxPayConfig(wxPayConfig);
		bestPayService.setAliPayConfig(aliPayConfig);
		return bestPayService;
	}

(4)生成二维码

2.2 扫码支付调用异步通知函数

(1)扫码支付

和微信一样,这里就不扫了。

(2)异步通知函数

签名校验、金额校验并告知微信不要重复通知。

	/**
	 * 异步通知处理
	 *
	 * @param notifyData
	 */
	@Override
	public String asyncNotify(String notifyData) {
		//1. 签名检验
		PayResponse payResponse = bestPayService.asyncNotify(notifyData);
		//2. 金额校验(从数据库查订单)
		//3. 修改订单支付状态
		if (payResponse.getPayPlatformEnum() == BestPayPlatformEnum.WX) {
			//4. 告诉微信不要再通知了
			return "<xml>\n" +
					"  <return_code><![CDATA[SUCCESS]]></return_code>\n" +
					"  <return_msg><![CDATA[OK]]></return_msg>\n" +
					"</xml>";
		}else if (payResponse.getPayPlatformEnum() == BestPayPlatformEnum.ALIPAY) {
			return "success";
		}

		throw new RuntimeException("异步通知中错误的支付平台");
	}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值