微信公众号支付
最近公司项目做了微信公众号支付,也在网上看了其他网友写的关于微信公众号支付的博客,首先很感谢他们把代码贡献出来,由于微信公众号支付API文档的变化,有些博客上的代码不能复用,近期贡献出来的代码,虽新但是代码不全,所以我把自己的代码整理一下,没有大神们封装的那么好,但是简单可用,供网友参考,如有疑惑或更好的方法请留言,后期会有微信其他的支付代码贡献给大家:
- 第一部分:引入pom文件,我们用的是springboot框架,只需要引这一个依赖就行了
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
- 第二部分:前端js页面
第一次用markdown编辑器,不熟悉,前端js页面代码不全,仅供参考
$(function(){ var url='********';//路径 var orderId; $.ajax({ type:"post", url:url+'这里添具体路径', dataType:'json', async:false, xhrFields: { withCredentials:true }, crossDomain: true, success:function(data){ orderId=data.data.orderId; var content; content = '<div class="outer">'+data.data.orderDesc+'</div><div class="inner">'+data.data.orderMoney+'</div>'; $('#content').append(content) } }) var appId; var timeStamp; var nonceStr; var package; var signType; var paySign; $.ajax({ type:"post", url:url+'这里添具体路径', dataType:'json', async:false, data:{"orderId":orderId}, xhrFields: { withCredentials:true }, crossDomain: true, success:function(data){ console.log(data) appId=data.data.appId timeStamp=data.data.timeStamp nonceStr=data.data.nonceStr package=data.data.package signType=data.data.signType paySign=data.data.paySign } }) function onBridgeReady(){ WeixinJSBridge.invoke('getBrandWCPayRequest', { "appId":appId, //公众号名称,由商户传入 "timeStamp":timeStamp, //时间戳,自1970年以来的秒数 "nonceStr":nonceStr, //随机串 "package":package, "signType":signType, //微信签名方式: "paySign":paySign //微信签名 },function(res){ if(res.err_msg == "get_brand_wcpay_request:ok"){ window.location.replace("user_index.html") }else if(res.err_msg == "get_brand_wcpay_request:cancel"){ alert("取消支付!"); }else{ alert("支付失败!"); } }); } function pay(){ if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady',onBridgeReady,false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', onBridgeReady); document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); } }else{ onBridgeReady(); } } $('#yajin').click(function(){ pay() }) })
第三部分后端代码
- 如果在用户登陆微信公众号时,就获取了openId,不用再用tookie获取了,拿来直接用就行了
package yangxiaosong.yangweixin;
import com.alibaba.fastjson.JSONObject;
import yangxiaosong.controller.wxpayutils.WXConfig;
import yangxiaosong.dataobject.user.User;
import yangxiaosong.dataobject.wxpay.WXPayOrder;
import yangxiaosong.enums.PayStatusEnum;
import yangxiaosong.service.ReturnRecordService;
import yangxiaosong.service.UserService;
import yangxiaosong.service.WXPayOrderService;
import yangxiaosong.utils.CookieUtil;
import yangxiaosong.utils.RedisUtil;
import yangxiaosong.utils.ResultVOUtil;
import yangxiaosong.viewobject.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.jdom.JDOMException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigDecimal;
import java.util.*;
@RestController
@RequestMapping(“/wxpay”)
@Slf4j