微信JS支付服务端Java版,扫码支付,公众号支付,Jsapi支付

微信支付后端Java的参考资料太少了,官方也没出个Demo,琢磨了一会Php版的,现在把Java版的写出来,参考一下

  1. 微信JSAPI支付发起统一下单需要openid,openid是微信用户在微信里面的唯一标识,而拿到这个需要微信的登录授权和access_token.所以第一步我们需要拿到这两个参数

新建一个javaBean, 用来接收微信的个人信息

public class WeChatUserInfo implements Serializable{

/**
* 通过token拉取对策微信用户信息
*/
private static final long serialVersionUID = -8479281962592272980L;

private String openid;

private String nickname;

private String sex;

private String province;

private String city;

private String country;

private String headimgurl;

private String[] privilege;

private String unionid;

private String language;

public String getOpenid() {
return openid;
}

获取微信的登录授权(这个链接地址,是扫码过来的,可以把这个链接做成二维码)

/**
* 扫码支付(返回可查询微信用户信息的code)
* @param state (商户自定义参数)
* @return
*/
@RequestMapping("codeCall")
public String codeCall(String state){
String url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+APP_ID+"&redirect_uri=https://xxxx.com/codePay/codePayBack.do&response_type=code&scope=snsapi_userinfo&state="+state+"#wechat_redirect";
return "redirect:"+url;
}

登录授权后开始获取access_token,并跳转支付金额选择页面codePay.jsp

 

/**
* 微信回调code
* @param code
* @param state
* @param map
* @return
*/
@RequestMapping("codePayBack")
public String codePayBack(String code,String state,ModelMap map){
logger.info("《《《《《《二维码支付回调》》》》》》》》》");
System.out.println("CODE="+code);
System.out.println("STATE="+state);
// code="021YYFU71qH1hX1cRwW71PHFU71YYFUJ";
//1.根据code拿到 access_token和openid
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+APP_ID+"&secret="+SECRET+"&code="+code+"&grant_type=authorization_code";
String json= this.loadJson(url);
ObjectMapper mapper = new ObjectMapper();
WeChatToken ect= null;
try {
ect=mapper.readValue(json,WeChatToken.class);
logger.info("》》》》成功获取access_token和openid");
logger.info("access_token"+ect.getAccess_token());
logger.info("openid"+ect.getOpenid());
} catch (IOException e) {
logger.info("WeChatToke json 转换出错");
}
//2.根据access_token 和 openid 抓取用户信息
String url2 ="https://api.weixin.qq.com/sns/userinfo?access_token="+ect.getAccess_token()+"&openid="+ect.getOpenid()+"&lang=zh_CN";
String json2= this.loadJson(url2);
WeChatUserInfo wcif = null;
try {
wcif = mapper.readValue(json2, WeChatUserInfo.class);
logger.info("》》》》成功获取微信用户信息");
logger.info("access_token"+wcif.getNickname());
} catch (IOException e) {
logger.info("WeChatUserInfo json 转换出错");
}
map.put("code", code);
map.put("state", state);
map.put("openid", wcif.getOpenid());
map.put("nickname", wcif.getNickname());
return "/weixin/codePay";
}

codePay.jsp 

注意:这个jsp目录发起微信的jssdk 支付,必须要在微信后台配置支付授权,并且是这个页面发起jsapi sdk支付的那个请求目录

微信JS支付服务端Java版,扫码支付,公众号支付,Jsapi支付

微信JS支付服务端Java版,扫码支付,公众号支付,Jsapi支付

codePay.jsp 

 

<script src='../assets/js/jquery-2.0.3.min.js'></script>
<script type="text/javascript">
var checkSubmitFlg = false;

function jsApiCall()
{
var total_fee=$("#amount").val();
var openid=$("#openid").val();
var pg_id=$("#pg_id").val();
var nickname=$("#nickname").val();

if($.trim(total_fee)==""){
alert("请输入金额")
checkSubmitFlg = false;
return;
}
if(!isPirce(total_fee)){
alert("请输入正确的金额")
checkSubmitFlg = false;
return;
}
$.post("/codePay/qrcodeWeChatPay.do", { openid: openid, total_fee: total_fee,pg_id:pg_id ,nickname:nickname},
function(data){
if(data.status==0){ //返回sucess
var param=data.data;//json 参数
WeixinJSBridge.invoke( //开始发起支付
'getBrandWCPayRequest',
param,
function(res){
WeixinJSBridge.log(res.err_msg);
WeixinJSBridge.call("closeWindow");
}
);


}else{
checkSubmitFlg = false;
alert("请求参数失败")
}
});


}

function callpay()
{
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}else{
if (!checkSubmitFlg) {
// 第一次提交
checkSubmitFlg = true;
jsApiCall();
}else{
return;
}

}
}

//判断输入的是不是个金额
function isPirce(s){
s = $.trim(s);
var p =/^[1-9](\d+(\.\d{1,2})?)?$/;
var p1=/^[0-9](\.\d{1,2})?$/;
return p.test(s) || p1.test(s);
}

</script>

</head>

<body onselectstart="return true;" οndragstart="return false;">
<div class="container gray_bg">
<div class="explain">
<h3>
企业微信支付-扫码自定义金额
</h3>
</div>
<div class="box apply_box" id="applyBox">
<dl class="pb15">
<dt>
金额(¥)
</dt>
<dd>
<input name="total_fee" class="txt required" id="amount" value="" placeholder="请输入数字金额,单位元" type="text"/>
</dd>

</dl>
</div>
<div class="sub_wrap">
<input id="openid" type="hidden" name="openid" value="${openid}">
<input id="pg_id" type="hidden" name="pg_id" value="${state}">
<input id="nickname" type="hidden" name="nickname" value="${nickname}">
<input type="button" class="btn" id="subBtn" οnclick="callpay()" value="提交"/>
<div class="copyright">技术支持
</div>
</div>

</div>
</body>
</html>

 

到这里把金额和openid传递到qrcodeWeChatPay.do这个请求,开始统一下单,下单后拿到的包含prepayid的json,就可以发起支付了.