微信支付后端Java的参考资料太少了,官方也没出个Demo,琢磨了一会Php版的,现在把Java版的写出来,参考一下
- 微信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支付的那个请求目录
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;" ondragstart="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" onclick="callpay()" value="提交"/>
<div class="copyright">技术支持
</div>
</div>
</div>
</body>
</html>
到这里把金额和openid传递到qrcodeWeChatPay.do这个请求,开始统一下单,下单后拿到的包含prepayid的json,就可以发起支付了.