新手写微信的H5支付

---------------------------------实习期写的java的微信H5支付(众多不足,bug,敬请谅解)----------------------------

微信的支付,好多地方需要去微信公众平台上设置(扫码回调,授权回调,支付安全)

下载好sdk测试你的appid,mchid,key是否正确,如果过程中出现sign错误,你去文档里面查看sign的生成规则!

       首先需要看文档,根据自己的需求判断出你要使用微信的那一类支付(当时我就弄错了,本来想弄聚合支付,刚开始没搞明白,一直以为是微信扫码支付,结果,扫码支付快做完了,发现没办法实现用户自主输入金额,才知道要用微信的H5支付,trade_type=JSAPI);用的是mybatis + Springmvc。好多地方都不太清楚,贴代码给大家看

public void getinfofinal(HttpServletRequest request, HttpServletResponse response,HttpSession session,String                                                                                                                                mch_id,String key) throws IOException{

String appid = config.APPID;
String backUri = "http://xxxxxxxxxxxxxxxx/wxpay/navigation.html";
//URLEncoder.encode 后可以在backUri 的url里面获取传递的所有参数
backUri = URLEncoder.encode(backUri);
//scope 参数视各自需求而定,这里用scope=snsapi_base 不弹出授权页面直接授权目的只获取统一支付接口的openid
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
url = url.format(url, appid,backUri);
response.sendRedirect(url);

}

--getinfofinal获取到带有code的链接,

public String navigation(HttpServletRequest request,HttpServletResponse response,String code,HttpSession session) throws Exception{
Map<String, String> accessToken=codeChangeAccessToken(code);
if(accessToken.get("openid")!=null && accessToken.get("openid")!=""){
session.setAttribute("OPENID", accessToken.get("openid"));
session.setAttribute("accessToken",accessToken);
openid=(String) session.getAttribute("OPENID");
System.out.println("openid---------------------------------------------------------------------------"+session.getAttribute("OPENID"));
}else{}
return "/jsp/admin/getAmount";

}

--然后用得到的code去换取accessToken(map),获取到openid

-- 到这里会出现错误,有的时候会出现重复请求,需要去判断,然后拿到正确的openid。下面贴出换取accessToken的方法

public Map<String, String> codeChangeAccessToken(String code) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token";
Map<String, String> param = new HashMap<String, String>();
param.put("appid", config.APPID);
param.put("secret", config.appSecret);
param.put("code", code);
param.put("grant_type", "authorization_code");
String json = this.doGet(url, param, "utf-8");
return JSON.parseObject(json, Map.class);

}

--return "/jsp/admin/getAmount";这个页面就是你写的微信支付的H5页面,获取到用户输入的金额

public Map<String, String> Pay2WxPackage(HttpServletRequest request,HttpSession session) throws Exception{
IMap params=new IMap(request);
String mch_id=(String) session.getAttribute("mch_id");
String key=(String) session.getAttribute("key");
System.out.println(mch_id+"-------"+key);
String finaPackage=null;
String totalFeeStr=params.getString("totalFee");
String totalFee=getMoney(totalFeeStr);
String appid=config.APPID;
String spbill_create_ip=config.SPBILL_CREATE_IP;
//获取时间戳,得到订单号
String out_trade_no=WXPayUtil.generateUUID();  //32位的uuid作为订单号
String notify_url=config.NOTIFY_URL;
String nonce_str = WXPayUtil.generateUUID();
String trade_type=config.trade_type;
String body="商家店名";
String prepay_id=getprepayid(openid, totalFee, body,nonce_str,mch_id,key);
//获得到预支付id  ,本地生成订单录入数据库
                //    根据自己的业务逻辑

Map<String, String> finalpackage = new HashMap<String, String>();
String timestamp=String.valueOf(WXPayUtil.getCurrentTimestamp());  
String packages = "prepay_id="+prepay_id;
finalpackage.put("package", packages);
finalpackage.put("appId", appid);  
finalpackage.put("timeStamp", timestamp);  
finalpackage.put("nonceStr", nonce_str);  
finalpackage.put("signType", "MD5");
String xml=WXPayUtil.mapToXml(finalpackage);
String finalsign=WXPayUtil.generateSignature(finalpackage, key);
System.out.println(WXPayUtil.isSignatureValid(finalpackage, key));
finalpackage.put("packages", packages);
finalpackage.put("paySign",finalsign);
finalpackage.put("out_trade_no",out_trade_no);
finaPackage = "{\"appId\":\"" + appid + "\",\"timeStamp\":\"" + timestamp
+ "\",\"nonceStr\":\"" + nonce_str + "\",\"packages\":\""
+ packages + "\",\"signType\" : \"MD5" + "\",\"paySign\":\""
+ finalsign + "\"}";
return finalpackage;
}

--返回的这些参数finaPackage 需要返回到页面,通过js发起支付,具体的微信文档里面有代码,可以拷贝过来用。


-- 支付成功后,微信会发送给你一个通知,在统一下单的时候就设置的通知地址notity_url,

--你需要先用流的方式接收,然后拿到你的订单号,在数据库里修改订单状态为已支付!!!

微信支付完成


猜你喜欢

转载自blog.csdn.net/qq_36948916/article/details/79539803