前言:本文基于PC网站须要,所开发的微信Native网页领取,技术栈,后端蕴含JAVA、SpringBoot、Maven、Mybatis、Mysql,前端蕴含HTML5、JS、JQUERY、AJAX等
开发前筹备:1、申请APPID申请形式:第一种:微信小程序,请返回小程序平台申请第二种:微信公众号,请返回公众平台申请第三种:如果商户已领有以上两种的其一,则能够返回开放平台申请
2、申请mchId步骤:1、首先返回商户号申请平台申请2、其次申请胜利后,微信官网会向申请时所填写的分割邮箱下发告诉邮件,内容蕴含申请胜利的mchid及其登录账号密码,亦能够,登录商户平台,在【账户核心】的商户信息哪里也能够看到3、最初,请妥善保留2的信息留神:一个mchid只能对应一个结算币种,若须要应用多个币种收款,须要申请对应数量的mchid。
3、绑定APPID及mchid步骤:1、登录微信商户平台,点击【产品核心】,在左侧点击【AppID账号治理】,而后再点击【我关联的AppID账号】,呈现列表,而后点击【+关联AppID】,而后输出商户号,提交就实现第一步了。2、登录微信公众平台(公众号,只有服务号才有微信领取,订阅号没有,望留神!),点击左侧“广告与服务->微信领取->商户号治理->待关联商户号”,而后在列表中找到确认信息,点击确认,即可实现绑定。
留神:只有服务号才有微信领取,订阅号没有,望留神!
提供流程图:1、2、3、
4、去商户平台配置APIV3密钥步骤:1、登录微信商户平台,进入【账户核心 > API平安 】目录,设置APIV3密钥。
2、在弹出窗口中点击“已沟通”。
3、输出API密钥,内容为32位字符,包含数字及大小写字母。点击获取短信验证码。(MD5加密收费获取32位字符)4、输出短信验证码,点击“确认”即设置胜利。
5、实现
5、下载并配置商户证书步骤:1、【商户平台】商户可登录微信商户平台,在【账户核心】->【API平安】->【申请证书】
2、【商户平台】在弹出窗口中点击“确定”。
3、【商户平台】在弹出窗口内点击“下载证书工具”按钮下载证书工具。
4、【证书工具】装置证书工具并关上,抉择证书须要存储的门路后点击“申请证书”。
5、【证书工具】在证书工具中,将复制的商户信息粘贴并点击“下一步”。
6、获取申请串
【证书工具】中操作【商户平台】中操作【商户平台】中操作7、【证书工具】复制证书串
8、【证书工具】粘贴证书串
9、【证书工具】生成证书胜利
10、在【证书工具】-“生成证书”环节,已实现申请证书流程,点击“查看证书文件夹”,查看已生成的证书文件。
11、实现
留神:在后面带【商户平台】,意思是在商户平台中的操作,后面带【证书工具】,意思是在证书工具中操作,望勿弄混!
6、获取证书中的商户序列号,领取须要用到步骤:1、【商户平台】商户可登录微信商户平台,在【账户核心】->【API平安】->【治理证书】2、关上的窗口,展现证书列表,第一列就是证书序列号,将其保留,以待前面用到。
正式开发步骤:提要:步骤分的很细,很费神,但能够更直辩的了解!
1、Maven引入领取依赖包<!--微信领取依赖包--><dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version></dependency>2、Maven引入领取签名、应答签名的验证封装依赖包<!--微信领取签名、应答签名的验证封装包--><dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-apache-httpclient</artifactId> <version>0.4.7</version></dependency>3、Maven引入生成二维码的依赖包<!--引入生成二维码的依赖--><!-- https://mvnrepository.com/artifact/com.google.zxing/core --><dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version></dependency><!-- https://mvnrepository.com/artifact/com.google.zxing/javase --><dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.0</version></dependency>4、创立微信领取工具类WeChatPayUtils.java提要:本工具类:蕴含下单办法、查单办法,以及可能会用到的转换以及获取办法等
/** * 微信领取工具类 * @date 2022/6/16 * @author gxw */public class WeChatPayUtils { /*公众号/小程序信息*/ //appId private static final String APP_ID = PropertiesValues.getPropertiesValue("wx.pay.app_id", "application.properties"); //secret private static final String APP_SECRET = ""; /*商户信息*/ //商户号mch_id private static final String MCH_ID = PropertiesValues.getPropertiesValue("wx.pay.mch_id", "application.properties"); //商户私钥mch_key private static final String MCH_KEY = "下载证书的***key.pem文件内容"; //商户证书序列号 private static final String MCH_SERIAL_NO = PropertiesValues.getPropertiesValue("wx.pay.mch_serial_no", "application.properties"); //API3私钥 private static final String MCH_API_V3_KEY = PropertiesValues.getPropertiesValue("wx.pay.api_key", "application.properties"); /*领取信息*/ //native 对立下单API public static final String NATIVE_PAY_API = PropertiesValues.getPropertiesValue("wx.pay.native.url", "application.properties"); //native 商户订单号查单API public static final String NATIVE_PAY_OUT_TRADE_NO_QUERY_ORDER_API = PropertiesValues.getPropertiesValue("wx.pay.out_trade_no.query_order", "application.properties"); //native 微信零碎订单号查单API public static final String NATIVE_PAY_TRANSACTIONS_ID_QUERY_ORDER_API = PropertiesValues.getPropertiesValue("wx.pay.transactions_id.query_order", "application.properties"); //货币类型 public static final String CURRENCY_CNY = "CNY"; //领取类型 public static final String TRADE_TYPE = "NATIVE"; //异步回调地址 public static final String NOTIFY_URL = PropertiesValues.getPropertiesValue("wx.pay.notify_url", "application.properties"); /** * NATIVE获取CloseableHttpClient */ private static CloseableHttpClient initHttpClient(){ PrivateKey merchantPrivateKey = null; try { merchantPrivateKey = PemUtil .loadPrivateKey(new ByteArrayInputStream(MCH_KEY.getBytes("utf-8")));// //*加载证书管理器实例*//*// // 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)// AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(// new WechatPay2Credentials(MCH_ID, new PrivateKeySigner(MCH_SERIAL_NO, merchantPrivateKey)),MCH_API_V3_KEY.getBytes("utf-8"));// //获取单例实例 CertificatesManager certificatesManager = CertificatesManager.getInstance();// //向证书管理器减少商户信息,并开启自动更新 certificatesManager.putMerchant( MCH_ID, new WechatPay2Credentials( MCH_ID, new PrivateKeySigner(MCH_SERIAL_NO, merchantPrivateKey)), MCH_API_V3_KEY.getBytes("utf-8") ); //从证书管理器取得验签器 Verifier verifier = certificatesManager.getVerifier(MCH_ID); CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create() .withMerchant(MCH_ID, MCH_SERIAL_NO, merchantPrivateKey) .withValidator(new WechatPay2Validator(verifier)).build(); return httpClient; } catch (Exception e){ e.printStackTrace(); } return null; } /** * NATIVE 对立下单 * @param money * @param body * @return */ public static Map<String, String> native_payment_order(String money, String body, String outTradeNo) { try { CloseableHttpClient httpClient = initHttpClient(); HttpPost httpPost = new HttpPost(NATIVE_PAY_API); // 申请body参数 String reqdata = "{" //+ "\"time_expire\":\"2018-06-08T10:34:56+08:00\"," + "\"amount\": {" + "\"total\":" + Integer.parseInt(String.valueOf(Float.parseFloat(money) * 100).split("\\.")[0]) + "," + "\"currency\":\"" + CURRENCY_CNY + "\"" + "}," + "\"mchid\":\"" + MCH_ID + "\"," + "\"description\":\"" + body + "\"," + "\"notify_url\":\"" + NOTIFY_URL + "\"," + "\"out_trade_no\":\"" + outTradeNo + "\"," + "\"goods_tag\":\"课程购买\"," + "\"appid\":\"" + APP_ID + "\"" + "}"; StringEntity entity = new StringEntity(reqdata, "utf-8"); entity.setContentType("application/json"); httpPost.setEntity(entity); httpPost.setHeader("Accept", "application/json"); //实现签名并执行申请 CloseableHttpResponse response = null; Map<String, String> resultMap = new HashMap<>(); try { response = httpClient.execute(httpPost); int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == 200) { //解决胜利 String codeUrl = EntityUtils.toString(response.getEntity()); codeUrl = codeUrl.substring(codeUrl.indexOf("w"), codeUrl.indexOf("}") - 1); String path = QRCodeGenerator.generateQRCodeImage(codeUrl); resultMap.put("code", "200"); resultMap.put("data", path); System.out.println("生成胜利,门路为:" + path); System.out.println("success,return body = " + codeUrl); return resultMap; } else if (statusCode == 204) { //解决胜利,无返回Body System.out.println("success"); resultMap.put("code", "204"); resultMap.put("msg", "解决胜利,但无返回Body"); return resultMap; } else { System.out.println("failed,resp code = " + statusCode + ",return body = " + EntityUtils.toString(response.getEntity())); throw new IOException("request failed"); } } catch (Exception e) { e.printStackTrace(); } finally { response.close(); } } catch (Exception e) { e.printStackTrace(); } return null; } /** * NATIVE 查问订单 * @param outTradeNo 商户订单号 * @return */ public static Map<String, String> native_query_order(String outTradeNo) { CloseableHttpResponse response = null; try { String url = NATIVE_PAY_OUT_TRADE_NO_QUERY_ORDER_API + outTradeNo; //申请URL URIBuilder uriBuilder = new URIBuilder(url); uriBuilder.setParameter("mchid", MCH_ID); //实现签名并执行申请 HttpGet httpGet = new HttpGet(uriBuilder.build()); httpGet.addHeader("Accept", "application/json"); response = initHttpClient().execute(httpGet); int statusCode = response.getStatusLine().getStatusCode(); Map<String, String> resultMap = new HashMap<>(); if (statusCode == 200) { String resData = EntityUtils.toString(response.getEntity()); Map<String, Object> data = JSON.parseObject(resData, HashMap.class); String tradeState = String.valueOf(data.get("trade_state")); if("SUCCESS".equals(tradeState)){ resultMap.put("msg", "领取胜利"); }else if("NOTPAY".equals(tradeState)){ resultMap.put("msg", "订单尚未领取"); }else if("CLOSED".equals(tradeState)){ resultMap.put("msg", "此订单已敞开,请从新下单"); }else if("USERPAYING".equals(tradeState)){ resultMap.put("msg", "正在领取中,请尽快领取实现哦"); }else if("PAYERROR".equals(tradeState)){ resultMap.put("msg", "领取失败,请从新下单"); } resultMap.put("code", "200"); resultMap.put("tradeState", tradeState);// resultMap.put("openId", String.valueOf(JSON.parseObject(String.valueOf(data.get("payer")), HashMap.class).get("openid")));// resultMap.put("transactionId", String.valueOf(data.get("transaction_id"))); return resultMap; } else if (statusCode == 204) { System.out.println("success");resultMap.put("code", "204"); resultMap.put("msg", "解决胜利,但无返回Body"); return resultMap; } else { System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity())); throw new IOException("request failed"); } } catch (URISyntaxException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } /** * APIV3密钥版,NATIVE领取回调参数解密 * @param map * @return */ public static Map<String, Object> paramDecodeForAPIV3(Map<String, Object> map){ //应用微信SDK提供的AesUtil工具类和APIV3密钥进行签名验证 AesUtil aesUtil = new AesUtil(MCH_API_V3_KEY.getBytes(StandardCharsets.UTF_8)); JSONObject paramsObj = new JSONObject(map); JSONObject rJ = paramsObj.getJSONObject("resource"); Map<String, String> paramMap = (Map) rJ; try { //如果APIV3密钥和微信返回的resource中的信息不统一,是拿不到微信返回的领取信息 String decryptToString = aesUtil.decryptToString( paramMap.get("associated_data").getBytes(StandardCharsets.UTF_8), paramMap.get("nonce").getBytes(StandardCharsets.UTF_8), paramMap.get("ciphertext")); //验证胜利后将获取的领取信息转为Map Map<String, Object> resultMap = WeChatPayUtils.strToMap(decryptToString); return resultMap; } catch (GeneralSecurityException e) { e.printStackTrace(); } return null; } /** * 交易起始工夫 */ public static String getTimeStart(){ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); return sdf.format(new Date()); } /** * 交易完结工夫(订单生效工夫) * @return */ public static String getTimeExpire(){ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); Calendar now = Calendar.getInstance(); now.add(Calendar.MINUTE, 30); return sdf.format(now.getTimeInMillis()); } /** * 获取32位随机字符串 * @return */ public static String getRandomStr() { return UUID.randomUUID().toString().replace("-", ""); } /** * 生成订单号 * @return */ public static String generateOrderNo() { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); return sdf.format(new Date()) + makeRandom(15); } /** * 生成随机数 纯数字 * * @return */ public static String makeRandom(int len) { return RandomUtils.generateRandomString(len); } /** * 将Map转换为XML格局的字符串 * * @param data Map类型数据 * @return XML格局的字符串 * @throws Exception */ public static String mapToXml(Map<String, String> data) throws Exception { org.w3c.dom.Document document = WXPayXmlUtil.newDocument(); org.w3c.dom.Element root = document.createElement("xml"); document.appendChild(root); for (String key: data.keySet()) { String value = data.get(key); if (value == null) { value = ""; } value = value.trim(); org.w3c.dom.Element filed = document.createElement(key); filed.appendChild(document.createTextNode(com.gxw.util.StringUtils.toUTF8(value))); root.appendChild(filed); } TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); DOMSource source = new DOMSource(document); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); StringWriter writer = new StringWriter(); StreamResult result = new StreamResult(writer); transformer.transform(source, result); String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", ""); try { writer.close(); } catch (Exception ex) { } return output; } /** * Xml字符串转换为Map * * @param xmlStr * @return */ public static Map<String, String> xmlStrToMap(String xmlStr) { Map<String, String> map = new HashMap<String, String>(); Document doc; try { doc = DocumentHelper.parseText(xmlStr); Element root = doc.getRootElement(); List children = root.elements(); if (children != null && children.size() > 0) { for (int i = 0; i < children.size(); i++) { Element child = (Element) children.get(i); map.put(child.getName(), child.getTextTrim()); } } } catch (DocumentException e) { e.printStackTrace(); } return map; } /** * 办法用处: 对所有传入参数依照字段名的 ASCII 码从小到大排序(字典序),并且生成url参数串<br> * 实现步骤: <br> * * @param paraMap 要排序的Map对象 * @param urlEncode 是否须要URLENCODE * @param keyToLower 是否须要将Key转换为全小写 * true:key转化成小写,false:不转化 * @return */ public static String formatUrlMap(Map<String, String> paraMap, boolean urlEncode, boolean keyToLower) { String buff = ""; Map<String, String> tmpMap = paraMap; try { List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(tmpMap.entrySet()); // 对所有传入参数依照字段名的 ASCII 码从小到大排序(字典序) Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() { @Override public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) { return (o1.getKey()).toString().compareTo(o2.getKey()); } }); // 结构URL 键值对的格局 StringBuilder buf = new StringBuilder(); for (Map.Entry<String, String> item : infoIds) { if (StringUtils.isNotBlank(item.getKey())) { String key = item.getKey(); String val = item.getValue(); if (urlEncode) { val = URLEncoder.encode(val, "utf-8"); } if (keyToLower) { buf.append(key.toLowerCase() + "=" + val); } else { buf.append(key + "=" + val); } buf.append("&"); } } buff = buf.toString(); if (buff.isEmpty() == false) { buff = buff.substring(0, buff.length() - 1); } } catch (Exception e) { return null; } return buff; } /** * 字符串转换为Map汇合 * @param str * @return */ public static Map<String, Object> strToMap(String str){ Map<String, Object> map = JSON.parseObject(str, HashedMap.class); return map; }}5、Controller领取下单接口 /** * native 领取下单 * @param request * @param lcGoodsOrder * @return */ @RequestMapping("/nativePaymentOrder") @NoVerify public synchronized Map<String, String> nativePaymentOrder( HttpServletRequest request, @RequestBody LcGoodsOrder lcGoodsOrder){ logger.info("【微信Native领取-领取下单】************开始解决*************"); //商户订单号 String outTradeNo = ALiPayUtils.generateOrderNum(); Map<String, String> data = WeChatPayUtils.native_payment_order(lcGoodsOrder.getTotalAmount(), lcGoodsOrder.getSubject(), outTradeNo); if("200".equals(data.get("code"))){ logger.info("【微信Native领取-领取下单】下单胜利,下单用户:{}, 下单手机号:{}", lcGoodsOrder.getPayUserName(), lcGoodsOrder.getPayUserPhone()); /*订单记录数据库中*/ lcGoodsOrder.setOutTradeNo(outTradeNo); lcGoodsOrder.setPayType("1");//微信Native领取类型 lcGoodsOrderService.wxInsert(lcGoodsOrder); /*解决返回前端须要数据*/ data.put("outTradeNo", outTradeNo); data.put("payUserName", lcGoodsOrder.getPayUserName()); data.put("payUserPhone", lcGoodsOrder.getPayUserPhone()); data.put("totalAmount", lcGoodsOrder.getTotalAmount()); return data; } logger.info("【微信Native领取-领取下单】下单失败,下单用户:{}, 下单手机号:{}", lcGoodsOrder.getPayUserName(), lcGoodsOrder.getPayUserPhone()); logger.info("【微信Native领取-领取下单】************完结解决*************"); return null; }6、Controller领取回调接口/** * native 异步回调解决办法 * @param request * @return */ @PostMapping("/nativeNotifyProcess") @NoVerify public synchronized String nativeNotifyProcess( HttpServletRequest request, HttpServletResponse response) throws Exception { logger.info("【微信Native领取-领取回调】************开始解决*************"); Map<String, Object> map = new ObjectMapper().readValue(request.getInputStream(), Map.class); logger.info("【微信Native领取-领取回调】返回后果:{}",map); Map<String, Object> dataMap = WeChatPayUtils.paramDecodeForAPIV3(map); //判断是否⽀付胜利 if("SUCCESS".equals(dataMap.get("trade_state"))){ logger.info("【微信Native领取-领取回调】判断领取胜利, 商户订单号:{}", dataMap.get("out_trade_no")); //领取胜利,业务解决 LcGoodsOrder lcGoodsOrder = new LcGoodsOrder(); //商户订单号 lcGoodsOrder.setOutTradeNo(String.valueOf(dataMap.get("out_trade_no"))); //付款用户openId lcGoodsOrder.setWxOpenId(String.valueOf(JSON.parseObject(String.valueOf(dataMap.get("payer")), HashMap.class).get("openid"))); //领取胜利 lcGoodsOrder.setOrderStatus("2"); //微信系统生成的订单号 lcGoodsOrder.setWxSysOrderNo(String.valueOf(dataMap.get("transaction_id"))); //批改订单信息 lcGoodsOrderService.updateById(lcGoodsOrder); //给微信发送我已接管告诉的响应 //创立给微信响应的对象 Map<String, String> returnMap = new HashMap<>(); returnMap.put("code", "SUCCESS"); returnMap.put("message", "胜利"); //将返回微信的对象转换为xml String returnXml = WeChatPayUtils.mapToXml(returnMap); logger.info("【微信Native领取-领取回调】微信Native领取胜利,并且给微信返回响应数据!, 商户订单号:{}", dataMap.get("out_trade_no")); return returnXml; } //领取失败 //创立给微信响应的对象 Map<String, String> returnMap = new HashMap<>(); returnMap.put("code", "FALL"); returnMap.put("message", ""); //将返回微信的对象转换为xml String returnXml = WeChatPayUtils.mapToXml(returnMap); logger.info("【微信Native领取-领取回调】判断领取失败, 商户订单号:{}", dataMap.get("out_trade_no")); logger.info("【微信Native领取-领取回调】************完结解决*************"); return returnXml; }7、Controller查问订单接口/** * native 领取查单,通过商户订单号查问订单状态 * @param lcGoodsOrder * @return */ @RequestMapping("/nativeQueryOrder") @NoVerify public synchronized Map<String, String> nativeQueryOrder( @RequestBody LcGoodsOrder lcGoodsOrder){ logger.info("【微信Native领取-商户订单号查单】************开始解决*************,商户订单号:{}", lcGoodsOrder.getOutTradeNo()); Map<String, String> data = WeChatPayUtils.native_query_order(lcGoodsOrder.getOutTradeNo()); //判断查单是否胜利 if("200".equals(data.get("code"))){ logger.info("【微信Native领取-商户订单号查单】查单胜利,商户订单号:{}", lcGoodsOrder.getOutTradeNo()); //判断查问订单是否领取胜利 if("SUCCESS".equals(data.get("tradeState"))){ logger.info("【微信Native领取-商户订单号查单-领取胜利】查单后果领取胜利,商户订单号:{}", lcGoodsOrder.getOutTradeNo()); ResultMap resultMap = lcGoodsOrderService.selectByType("outTradeNo", lcGoodsOrder.getOutTradeNo()); //判断数据库订单查问是否胜利 if("200".equals(resultMap.getCode())){ logger.info("【微信Native领取-商户订单号查单-数据库数据验证】数据库订单数据查问胜利,商户订单号:{}", lcGoodsOrder.getOutTradeNo()); LcGoodsOrder lcGoodsOrder1 = (LcGoodsOrder) resultMap.getData(); //如果数据库数据尚未批改订单为实现状态,则进行批改 if(lcGoodsOrder1.getOrderStatus().equals("1")){ logger.info("【微信Native领取-商户订单号查单-数据库数据验证】数据库订单数据尚未确认订单实现,商户订单号:{}", lcGoodsOrder.getOutTradeNo()); //付款用户openId lcGoodsOrder.setWxOpenId(data.get("openId")); //领取胜利 lcGoodsOrder.setOrderStatus("2"); //微信系统生成的订单号 lcGoodsOrder.setWxSysOrderNo(data.get("transactionId")); lcGoodsOrderService.updateById(lcGoodsOrder); logger.info("【微信Native领取-商户订单号查单-数据库数据验证】数据库订单数据确认订单实现,商户订单号:{}", lcGoodsOrder.getOutTradeNo()); } } }// data.remove("openId");// data.remove("transactionId"); logger.info("【微信Native领取-商户订单号查单】************完结解决*************,商户订单号:{}", lcGoodsOrder.getOutTradeNo()); return data; } return null; }8、PC网站页面调用下单接口/** * 调用微信领取接口 * @param {Object} data * @autors gxw */function wechatPay(data){ var url = "http://127.0.0.1:8686/lcWeChataPay/nativePaymentOrder"; $.ajax({ url: url, type: 'post', data: JSON.stringify({ payUserName: data.payUserName, payUserPhone: data.payUserPhone, payMessage: data.payMessage, goodsId: data.goodsId, totalAmount: data.totalAmount, subject: data.subject, }), contentType: "application/json", dataType: 'json', success: function(res){ if(res != null){ if(res.code == "200"){ window.location.href = "wx_pay.html?otn="+res.outTradeNo +"&pun="+encodeURI(res.payUserName) +"&pup="+res.payUserPhone +"&codePath="+res.data +"&m="+res.totalAmount }else{ alert("网络异样"); alert(res.msg); } }else{ alert("网络异样,确认网络无问题,请刷新页面!"); } }, fail: function(res){ console.log("失败") console.log(res); } })}9、领取实现,点击已领取,调用查单接口,判断是否领取胜利,胜利,则跳转到胜利页面 /** * 查问订单,测验订单状态 * @autors gxw */ function checkPayStatus(){ var url = "http://127.0.0.1:8686/lcWeChataPay/nativeQueryOrder"; $.ajax({ url: url, type: 'post', data: JSON.stringify({ outTradeNo: otn }), contentType: "application/json", dataType: 'json', success: function(res){ if(res != null){ if(res.code == "200"){ if(res.tradeState == "SUCCESS"){ window.location.href = "pay_success.html?otn="+otn +"&pun="+encodeURI(pun) +"&pup="+pup +"&m="+m }else{ alert(res.msg); return false; } }else{ alert("网络异样"); alert(res.msg); } }else{ alert("网络异样,确认网络无问题,请刷新页面!"); } }, fail: function(res){ console.log("失败") console.log(res); } }) }10、这样PC网站微信NATIVE网页领取,即可实现!=========================但这还没有完结====================
...