1. 发起支付
1.1. 请求地址
关键类:net.mingsoft.pay.action.web.PayAction.java 关键方法:geteway(....)
1.2. 支付范例
支付须配置支付宝配置或微信支付配置
1.2.1. 支付宝支付
第一步:配置相关支付宝的支付配置;
第二步:编写html代码,写一个简单form表单;
alipay.html
...
<!--支付宝支付,提交成功后直接跳转支付宝支付-->
<form action="http://项目地址/mpay/pay/gateway.do" method="post">
<input type="hidden" name="returnUrl" value="http://项目地址/ok.jsp"/><!--支付成功返回地址-->
<input type="hidden" name="orderNo" value="8888888"/><!--订单号-->
<input type="hidden" name="orderName" value="铭飞开源赞助"/><!--订单名称-->
<input type="hidden" name="type" value="alipay"/><!--支付类型-->
<input type="hidden" name="orderPrice" value="0.01"/><!--价格-->
<input type="hidden" name="orderDesc" value="价值源自分享"/><!--商品描述-->
<input type="hidden" name="showUrl" value="http://www.mingsoft.net"/><!--商品展示网址-->
<input type="submit" value="确认">
</form>
...
1.2.2. 微信扫码支付
第一步:配置微信支付相关的支付配置;
第二步:编写html代码,写一个简单form表单;
根据表单提交的结果显示二维码图片,通常结合ajax来实现
...
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<form>
<input type="hidden" name="orderNo" value="8888888"/><!--订单号-->
<input type="hidden" name="type" value="weixin"/><!--支付类型-->
<input type="hidden" name="orderPrice" value="0.01"/><!--价格-->
<input type="hidden" name="orderDesc" value="价值源自分享"/><!--商品描述-->
<input type="submit" value="确认">
</form>
<!--显示二维码-->
<img width="100" height="100"/>
<script>
$.ajax({
type: "POST",
dataType:"json",
url: "http://项目地址/mpay/pay/gateway.do",
data: $("form").serialize(),
success: function(json){
$("img").attr("src","http://项目地址/qrcode?contents="+json.resultMsg)
}
});
</script>
...
1.2.3. 微信公众号支付
微信公众号支付需要在公众号内部完成,同时用户需要进行授权登录
参考微信官方文档_https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1
编写html代码,写一个简单form表单
...
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<!--创建支付表单页面-->
<form id="weixin" name="weixin" >
<input type="hidden" name="orderNo" value="888888888"/><!--订单编号-->
<input type="hidden" name="type" value="weixin"/><!--支付类型-->
<input type="hidden" name="orderPrice" value="0.01"/><!--价格-->
<input type="hidden" name="orderDesc" value="测试公众号支付"/><!--描述-->
<input type="hidden" name="page" value="http://项目地址/wx-mp-pay.jsp"/><!--接收微信支付授权信息的页面-->
<!--多个公众号支付必传-->
<input type="hidden" name="appId" value="xxxxxxxx"/><!--微信appId-->
<input type="hidden" name="mchId" value="1234567890"/><!--微信支付商户号-->
<input type="hidden" name="key" value="xxxxxxxx"/><!--微信支付API密钥-->
<input type="hidden" name="secret" value="xxxxxxxx"/><!--Appsecret-->
<input type="submit" value="确认">
</form>
...
<script>
//授权登录,需要用户配置微信appid和项目请求支付地址
function weixinPay(){
location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=微信appid&redirect_uri=" + encodeURIComponent("http://项目地址/mpay/pay/gateway.do?" + $("#weixin").serialize()) + "&response_type=code&scope=snsapi_userinfo#wechat_redirect";
}
</script>
...
确认支付
...
<!--确认支付页面-->
<input type="button" onclick="pay()" value="支付"/>
<script>
function pay() {
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":<%=request.getParameter("appId")%>, //公众号名称,由商户传入
"timeStamp":"<%=request.getParameter("timeStamp")%>", //时间戳,自1970年以来的秒数
"nonceStr":"<%=request.getParameter("nonceStr")%>", //随机串
"package":"<%=request.getParameter("package")%>",
"signType":"MD5", //微信签名方式:
"paySign":"<%=request.getParameter("sign")%>" //微信签名
},
function(res){
if (res.err_msg == "get_brand_wcpay_request:ok") {
alert("微信支付成功!");
} else if (res.err_msg == "get_brand_wcpay_request:cancel") {
alert("用户取消支付!");
} else {
alert(JSON.stringify(res));
}
}
);
}
</script>
...
1.2.4. 微信刷卡支付
刷卡支付场景描述:用户出示微信付款二维码 、 商户使用扫码枪扫码,用户输入支付密码(小额免密),商务系统提示支付成功。
开发者需要制作一张支付表单页面,提交后直接返回支付结果
wx-card-pay.html
...
<!-- 微信刷卡支付,刷卡成功后会直接扣款,金额过大或其他原因会需要支付密码 -->
<!-- 具体参考微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=5_1 -->
<form id="submit" name="weixin" action="http://域名/项目/mpay/pay/gateway.do" method="post">
<input type="hidden" name="orderNo" value="888888"/><!--订单编号-->
<input type="hidden" name="type" value="weixin"/><!--支付类型-->
<input type="hidden" name="orderPrice" value="0.01"/>
<input type="hidden" name="orderDesc" value="铭飞商超系统"/>
<input type="text" name="authCode" value="45454XXXX3FF"/> <!--通过扫描枪扫码获取,可手动输入付款码底部对应的字符串-->
<input type="submit" value="确认">
</form>
...
2. 发起退款
2.1. 业务方法
关键类:net.mingsoft.pay.biz.IPayBiz 关键方法:refund(....)
2.2. 范例
...
PayRefundBean payRefundBean = new PayRefundBean();
payRefundBean.setOrderNo("201908080808"); //订单号
payRefundBean.setType("WEI_XIN"); //支付宝支付:ALI_PAY 微信支付:WEI_XIN
payRefundBean.setPrice("8.8"); //退款费用
if(!net.mingsoft.pay.biz.IPayBiz.refund(payRefundBean){
System.out.print("退款失败");
} else {
System.out.print("退款成功");
}
...
3. 支付回调
第三方支付平台会通过发起请求回调的通知业务系统支付的状态,业务系统根据返回的支付状态进行业务逻辑代码编写。
日志注解
注解可以保证将支付信息记录都交易日志表里面,推荐使用
@MPayNotifyLogAnn
3.1. 范例
只适用Spring MVC方式
...
@RequestMapping("/notify")
@MPayNotifyLogAnn
@ResponseBody
public void notify(HttpServletRequest request,HttpServletResponse response){
//根据对接的支付接口编写代码,具体请参考对接支付平台的接口文档
}
...