jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>会员充值</title>
<base href="<%=path %>" />
<meta name="viewport"content="width=device-width,initial-scale=1 user-scalable=0">
//<link rel="stylesheet" href="js/layer/theme/default/layer.css" type="text/css"><script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script src="js/jquery-1.12.3.min.js"></script>
<script type="text/javascript">$(function(){window.alert = function(name){var iframe = document.createElement("IFRAME");iframe.style.display="none";iframe.setAttribute("src", 'data:text/plain');document.documentElement.appendChild(iframe);window.frames[0].window.alert(name);iframe.parentNode.removeChild(iframe);}var openId = $("#openid").val();var url = location.href.split('#')[0];$.ajax({type : 'post',async : false,url : 'wxjsconfig/signature',data : {url : url},cache : false,dataType : 'json',success : function(data) {if (data.success == true) {var wxdata = data.userObject; // 微信配置wx.config({debug : false,appId : wxdata.appId,timestamp : wxdata.timestamp,nonceStr : wxdata.nonceStr,signature : wxdata.signature,jsApiList : [ 'chooseWXPay' ]// 功能列表,我们要使用JS-SDK的什么功能});} else {alert("WXJSSDK签名失败,原因:" + data.msg + "!");}}});$("#pay").click(function(){var money = $("#money").val();$.ajax({type : 'post',async : false,url : 'wechatpay/request-pay',data : {openId : openId,fillAmount : money,omid:"",bizType:0},cache : false,dataType : 'json',success : function(data) {if (data.success == true) {var paydata = data.userObject;wx.chooseWXPay({timestamp : paydata.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符nonceStr : paydata.nonceStr, // 支付签名随机串,不长于 32 位package : paydata.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)signType : paydata.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'paySign : paydata.paySign, // 支付签名success : function(res) {//跳转前一页并刷新页面self.location=document.referrer;},// 支付取消回调函数cencel: function (res) {alert('已取消支付~')},// 支付失败回调函数fail: function (res) {alert('支付失败~')},complete: function(res) {}});} else {alert("支付失败,原因:" + data.msg + "!");}}});})})
</script>
<style type="text/css">.btn{width: 8rem;height: 2.5rem;border-radius: 0.5rem;border: 1px solid;background-color: white;text-align: center;font-size: 1rem;margin:  auto;letter-spacing: 0.5rem;margin-top:3rem;display: block;}.p_text {border: 0;border-bottom: 1px solid #bfbfbf;width: 65%;line-height: 2rem;font-size: 2rem;letter-spacing: 2px;}.p_lable {font-size: 2rem;width: 25%;float: left;vertical-align: bottom;height: 2rem;line-height: 3rem;text-align: right;} .perfect-information-box{width:96%;padding:0 2%;background:#fff;}
</style>
</head>
<body><div style="height: 100%;margin-top: 30%"><input type="hidden" value="${openid}" id="openid"><div style="margin-top: 100px;width:90%; margin: 0 auto;background-color: white;"><p>充值金额:</p><span class="p_lable"></span><input id="money" class="p_text" type="number"/></div><div><button class="btn" id="pay" value="充值">充值</button></div></div>
</body>
</html>
 //这个是微信支付初始化配置方法@RequestMapping(value = "/wxjsconfig/signature", method = { RequestMethod.GET, RequestMethod.POST })public @ResponseBody ResultDto wechatpay_signature(HttpServletRequest request, String url) {//微信开发获取token   已保存到数据库  获取方式就不详细说了//AccessTokenInfo字段:  access_token  jsapi_ticket expires_inAccessTokenInfo tokenInfo = accessTokenService.getAccessToken(ctx);//可以看做从数据库读取token数据String appId = "xxxxxxxxxxxxxxxxxx";  //微信IdString timestamp = "" + (System.currentTimeMillis() / 1000);String nonceStr = "xxxxxxxxxxxx";   //开发密匙String jsapi_ticket = tokenInfo.getJsapi_ticket();List<String> params = new ArrayList<String>();params.add("noncestr=" + nonceStr);params.add("jsapi_ticket=" + jsapi_ticket);params.add("timestamp=" + timestamp);params.add("url=" + url);// 1. 将token、timestamp、nonce三个参数进行字典序排序Collections.sort(params, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.compareTo(o2);}});// 2. 将三个参数字符串拼接成一个字符串进行sha1加密String s = params.get(0) + "&" + params.get(1) + "&" + params.get(2) + "&" + params.get(3);String signature = SHA1.encode(s);Map<String, String> viewparams = new HashMap<String, String>();viewparams.put("appId", appId);viewparams.put("timestamp", timestamp);viewparams.put("nonceStr", nonceStr);viewparams.put("signature", signature);//ResultDto 自定义返回数据类似于mapResultDto rs = new ResultDto();rs.setSuccess(true);rs.setUserObject(viewparams);return rs;}
 package com.hiuseon.projs.jevoni.wechat.domain;import java.util.Date;import javax.persistence.Entity;
import javax.persistence.Table;import com.hiuseon.bdp.freamwork.domain.AbstractCoreBaseInfo;/*** 微信支付记录表* * @author xiaojiao_li**/
@Entity
@Table(name = "t_wx_wechatpay")
public class WechatPayInfo{//private static final long serialVersionUID = -519329508608980807L;private String omid;private String bizType;// 交易号private String out_trade_no;// 微信openidprivate String openid;// 关联用户手机private String userPhone;// 总付费用private int total_fee;// 存放orderIdprivate String userObject;// 状态 ,10为申请支付 ,20为支付中,30为支付成功private int status;// 申请提交支付时间private Date requestTime;// 支付完成时间private Date payedTime;// 微信交易idprivate String transaction_id;public String getOmid() {return omid;}public void setOmid(String omid) {this.omid = omid;}public String getBizType() {return bizType;}public void setBizType(String bizType) {this.bizType = bizType;}public String getOut_trade_no() {return out_trade_no;}public void setOut_trade_no(String out_trade_no) {this.out_trade_no = out_trade_no;}public String getOpenid() {return openid;}public void setOpenid(String openid) {this.openid = openid;}public String getUserPhone() {return userPhone;}public void setUserPhone(String userPhone) {this.userPhone = userPhone;}public int getTotal_fee() {return total_fee;}public void setTotal_fee(int total_fee) {this.total_fee = total_fee;}public String getUserObject() {return userObject;}public void setUserObject(String userObject) {this.userObject = userObject;}public int getStatus() {return status;}public void setStatus(int status) {this.status = status;}public Date getRequestTime() {return requestTime;}public void setRequestTime(Date requestTime) {this.requestTime = requestTime;}public Date getPayedTime() {return payedTime;}public void setPayedTime(Date payedTime) {this.payedTime = payedTime;}public String getTransaction_id() {return transaction_id;}public void setTransaction_id(String transaction_id) {this.transaction_id = transaction_id;}}
import java.math.BigDecimal;public class PayRsVo {private String bizType;private String orderId;private String phone;private BigDecimal fillAmount;public String getBizType() {return bizType;}public void setBizType(String bizType) {this.bizType = bizType;}public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId = orderId;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public BigDecimal getFillAmount() {return fillAmount;}public void setFillAmount(BigDecimal fillAmount) {this.fillAmount = fillAmount;}}
 //Controller方法/*** 接受微信支付通知回调的接口* * @param request* @return*/@RequestMapping(value = "/wechatpay/pay_notify", method = { RequestMethod.GET, RequestMethod.POST })public @ResponseBody String pay_notify(HttpServletRequest request) {IContext ctx = Context.createDefaultContext();// 从请求流里获取支付返回的相应结果StringBuffer sb = new StringBuffer();try {BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream) request.getInputStream()));String line = null;while ((line = br.readLine()) != null) {sb.append(line);}} catch (Exception ex) {throw new BaseException(ex);}// 转化为字符串String payXmlMsg = sb.toString();logger.info("notify xml : " + payXmlMsg);// 处理支付 是否成功。String rs = "SUCCESS";try {PayRsVo payrs = wechatPayService.notifyWechatPay( payXmlMsg);try {if ("微信支付".equals(payrs.getBizType())) {// 更新wechatPayService.updatePayDate(ctx, payrs.getOrderId(), new Date());} else if ("微信充值".equals(payrs.getBizType())) {// 更新} else {throw new BaseException("未知支付类型【" + payrs.getBizType() + "】");}} catch (Exception ex) {ex.printStackTrace();}} catch (Exception ex) {ex.printStackTrace();rs = "ERROR";}return rs;}/*** 提交申请支付的接口* * @param request* @param openId* @param orderId* @return*/@RequestMapping(value = "/wechatpay/request-pay", method = { RequestMethod.GET, RequestMethod.POST })public @ResponseBody ResultDto request_pay(HttpServletRequest request, String omid, String openId,@RequestParam(required = false) String orderId, int bizType,@RequestParam(required = false) String fillAmount) {// 获取客户端ipString clientIp = request.getRemoteHost();//判断金额是否正确 StringUtils:判断封装类 可自定义换个方式判断BigDecimal vipfillamt = null;if (!StringUtils.isEmptyString(fillAmount)) {try {vipfillamt = new BigDecimal(fillAmount);} catch (Exception ex) {throw new BizException("充值金额不正确!");}}// 发起支付请求Map<String, Object> map = wechatPayService.requestWechatPay( omid, bizType == 1 ? "微信支付" : "微信充值", clientIp,openId, orderId, vipfillamt);// 返回支付 ResultDto 封装返回类 类似于mapResultDto rs = new ResultDto();rs.setSuccess(true);rs.setUserObject(map);return rs;}
 //service方法public static String _getSign(String payKey, Map<String, Object> map) {ArrayList<String> list = new ArrayList<String>();for (Map.Entry<String, Object> entry : map.entrySet()) {if (entry.getValue() != "") {list.add(entry.getKey() + "=" + entry.getValue() + "&");}}int size = list.size();String[] arrayToSort = list.toArray(new String[size]);Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);StringBuilder sb = new StringBuilder();for (int i = 0; i < size; i++) {sb.append(arrayToSort[i]);}String result = sb.toString();result += ("key=" + (payKey.trim()));String newstr = MD5.MD5Encode(result.toString()).toUpperCase();return newstr;}/*** 申请发起微信支付*/@Overridepublic Map<String, Object> requestWechatPay( String omid, String bizType, String clientIp,String openId, String orderId, BigDecimal fillAmount) {//获取微信公众号信息//WechatUserInfo findInfo = wechatUserService.findByFieldSingle(ctx, "openId", openId);BigDecimal amount = null;String encodeOrderId = "";//因为我们是做的充值功能所以这部分可以注释/*if ("微信支付".equals(bizType)) {// 获取需要支付的记录OrderInfo orderInfo = orderService.findById(ctx, orderId);if (orderInfo == null) {throw new BizException("未匹配到订单!");}if (orderInfo.getStatus() != 0) {throw new BizException("该订单状态不是未付款!请重新操作");}try {encodeOrderId = URLEncoder.encode(orderId, "UTF-8");} catch (UnsupportedEncodingException e) {}amount = orderInfo.getYfAmount();} else {*/amount = fillAmount;//}if (amount == null) {throw new BizException("金额不能为空!");}if (amount.signum() < 0) {throw new BizException("支付金额不正确,请检查 !");}amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP);// 生成一个支付订单.String requestUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";//WechatAppInfo appInfo = wechatAppService.findAll(ctx).get(0); 微信开发者账号String appid = "xxxxxxx";//微信appidString mch_id = "xxxxxxxx"; //payMchIdString payKey = "xxxxx";//paykeyString attach = "pay";String body = "pay";String nonce_str = WX_APP_Config.WX_NonceStr;String notify_url = ApplicationUrlConfig.Wechat_BaseUrl + "wechatpay/pay_notify?orderId=" + encodeOrderId;String openid = openId;String out_trade_no = "" + (System.currentTimeMillis() / 1000);String spbill_create_ip = clientIp;int total_fee = amount.multiply(new BigDecimal("100")).setScale(2, BigDecimal.ROUND_HALF_UP).intValue();// 金额单位为分String trade_type = "JSAPI";Map<String, Object> params = new HashMap<String, Object>();params.put("appid", appid);params.put("attach", attach);params.put("body", body);params.put("mch_id", mch_id);params.put("nonce_str", nonce_str);params.put("notify_url", notify_url);params.put("openid", openid);params.put("out_trade_no", out_trade_no);params.put("spbill_create_ip", spbill_create_ip);params.put("total_fee", total_fee);params.put("trade_type", trade_type);String sign = _getSign(payKey, params);StringBuffer data = new StringBuffer();data.append("<xml>");data.append(" <appid>" + "<![CDATA[" + appid + "]]>" + "</appid>");data.append(" <attach>" + "<![CDATA[" + attach + "]]>" + "</attach>");data.append(" <body>" + "<![CDATA[" + body + "]]>" + "</body>");data.append(" <mch_id>" + "<![CDATA[" + mch_id + "]]>" + "</mch_id>");data.append(" <nonce_str>" + "<![CDATA[" + nonce_str + "]]>" + "</nonce_str>");data.append(" <notify_url>" + "<![CDATA[" + notify_url + "]]>" + "</notify_url>");data.append("  <openid>" + "<![CDATA[" + openid + "]]>" + "</openid>");data.append("  <out_trade_no>" + "<![CDATA[" + out_trade_no + "]]>" + "</out_trade_no>");data.append("  <spbill_create_ip>" + "<![CDATA[" + spbill_create_ip + "]]>" + "</spbill_create_ip>");data.append("  <total_fee>" + "<![CDATA[" + total_fee + "]]>" + "</total_fee>");data.append("  <trade_type>" + "<![CDATA[" + trade_type + "]]>" + "</trade_type>");data.append("  <sign>" + "<![CDATA[" + sign + "]]>" + "</sign>");data.append("</xml>");WechatPayInfo payinfo = new WechatPayInfo();payinfo.setOpenid(openId);payinfo.setOut_trade_no(out_trade_no);payinfo.setPayedTime(null);payinfo.setRequestTime(new Date());payinfo.setStatus(10);payinfo.setTotal_fee(total_fee);payinfo.setUserObject(orderId);payinfo.setOmid(omid);payinfo.setBizType(bizType);if (findInfo != null) {payinfo.setUserPhone(findInfo.getPhone());}payinfo.setStatus(10);// 向腾讯服务器发起支付请求逻辑String result = HttpClientHelper.doHttpBodyRequest(requestUrl, "POST", data.toString());Map<String, Object> rsmap = null;try {rsmap = XMLParser.getMapFromXML(result);Iterator<Entry<String, Object>> it = rsmap.entrySet().iterator();while (it.hasNext()) {Entry<String, Object> entry = it.next();}} catch (ParserConfigurationException | IOException | SAXException e) {throw new BaseException("提交交易申请失败,原因:" + e.getMessage() + "!");}if (rsmap == null || !"SUCCESS".equals(rsmap.get("return_code"))) {throw new BaseException("提交交易申请失败,原因:" + (rsmap == null ? "接收支付申请结果失败" :rsmap.get("return_msg")) + "!");}// 向腾讯服务器发起支付请求逻辑payinfo.setStatus(20);// 保存支付信息  把支付信息保存到数据库save(payinfo);// 返回相关内容String pay_timestamp = "" + (System.currentTimeMillis() / 1000);String pay_nonceStr = WX_APP_Config.WX_NonceStr;String pay_package = "prepay_id=" + rsmap.get("prepay_id").toString() + "";String pay_signType = "MD5";Map<String, Object> paymap = new HashMap<String, Object>();paymap.put("appId", appid);paymap.put("timeStamp", pay_timestamp);paymap.put("nonceStr", pay_nonceStr);paymap.put("package", pay_package);paymap.put("signType", pay_signType);String paySign = _getSign(payKey, paymap);Map<String, Object> map = new HashMap<String, Object>();map.put("timeStamp", pay_timestamp);map.put("nonceStr", pay_nonceStr);map.put("package", pay_package);map.put("signType", pay_signType);map.put("paySign", paySign);return map;}@Overridepublic PayRsVo notifyWechatPay( String payXmlMsg) {// 解析支付xml数据Map paymap = _readStringXmlOut(payXmlMsg);// 判断是否支付成功if (!"SUCCESS".equals(paymap.get("return_code").toString())) {throw new BaseException("支付失败!");}String orderId = String.valueOf(paymap.get("orderId"));String out_trade_no = paymap.get("out_trade_no").toString();String transaction_id = paymap.get("transaction_id").toString();String openid = paymap.get("openid").toString();String omid = paymap.get("omid") == null ? "1001" : paymap.get("omid").toString();//微信开发者账号//WechatAppInfo appInfo = wechatAppService.findAll(ctx).get(0);String appid = "xxxxxx";//appidString mch_id = "xxxx";//payMchidString payKey = "xxxx";    //payKeyString nonce_str = "xxxxxxxxxxxx";  //微信开发秘钥// 再调用微信支付订单查询api确认一下是否支付成功了String queryUrl = "https://api.mch.weixin.qq.com/pay/orderquery";Map<String, Object> params = new HashMap<String, Object>();params.put("appid", appid);params.put("mch_id", mch_id);params.put("nonce_str", nonce_str);params.put("transaction_id", transaction_id);String sign = _getSign(payKey, params);StringBuffer data = new StringBuffer();data.append(" <xml> ");data.append(" <appid>" + appid + "</appid> ");data.append(" <mch_id>" + mch_id + "</mch_id> ");data.append(" <nonce_str>" + nonce_str + "</nonce_str> ");data.append(" <transaction_id>" + transaction_id + "</transaction_id> ");data.append(" <sign>" + sign + "</sign> ");data.append(" </xml> ");// 向腾讯服务器发起支付请求逻辑String result = HttpClientHelper.doHttpBodyRequest(queryUrl, "POST", data.toString());System.out.println(result.toString());Map<String, Object> rsmap = null;try {rsmap = XMLParser.getMapFromXML(result);System.out.println(rsmap.toString());Iterator<Entry<String, Object>> it = rsmap.entrySet().iterator();while (it.hasNext()) {Entry<String, Object> entry = it.next();}} catch (ParserConfigurationException | IOException | SAXException e) {throw new BaseException("查询订单失败,原因:" + e.getMessage() + "!");}if (rsmap == null || !"SUCCESS".equals(rsmap.get("return_code"))) {throw new BaseException("查询订单失败,原因:" + (rsmap == null ? "查询结果 无法获取" : rsmap.get("return_msg")) + "!");}if (!"SUCCESS".equals(rsmap.get("result_code"))) {throw new BaseException("订单业务返回值不成功,为失败!");}if (!"SUCCESS".equals(rsmap.get("trade_state"))) {throw new BaseException("交易结果不成功!");}QueryFilterInfo ev = new QueryFilterInfo();ev.getFilterItems().add(new FilterItemInfo("openid", openid));ev.getFilterItems().add(new FilterItemInfo("out_trade_no", out_trade_no));ev.getFilterItems().add(new FilterItemInfo("status", 20));List<SortItem> sorts = new ArrayList<SortItem>();sorts.add(new SortItem("requestTime", SortType.DESC));List<WechatPayInfo> list = findByFields(ctx, ev, sorts);if (list == null || list.isEmpty()) {throw new BaseException("交易单记录异常,无效,交易单匹配到" + (list == null ? 0 : list.size()) + "条!");}WechatPayInfo payInfo = list.get(0);if (payInfo.getStatus() != 30) {payInfo.setStatus(30);payInfo.setTransaction_id(transaction_id);payInfo.setPayedTime(new Date());save(ctx, payInfo);}if(payInfo.getStatus()==30 && payInfo.getBizType().equals("微信充值")) {//添加到充值记录RechargeInfo recharge = new RechargeInfo();//充值时间recharge.setCzDate(new Date());//充值金额double money =  (double)(Math.round(1)/100.0);recharge.setCzMoney(new BigDecimal(money));List<WechatUserInfo> listinfo = wechatUserService.findByField(ctx, "openId", payInfo.getOpenid());if(listinfo.isEmpty()) {throw new BizException("查不到此会员信息!!!");}//会员fidrecharge.setWechatuserId(listinfo.get(0).getFid());recharge.setName(listinfo.get(0).getName());rechargeService.save(ctx, recharge);//添加到余额表//先查询余额表是否有数据  有则修改 无则添加List<BalanceInfo> listbalan = BalanceServiceImpl.findByField(ctx, "wechatuserId",listinfo.get(0).getFid());if(listbalan.isEmpty()) {BalanceInfo balan = new BalanceInfo();balan.setWechatuserId(listinfo.get(0).getFid());balan.setName(listinfo.get(0).getName());balan.setBalanceMoney(new BigDecimal(money));BalanceServiceImpl.save(ctx, balan);}else {listbalan.get(0).setBalanceMoney(listbalan.get(0).getBalanceMoney().add(new BigDecimal(money)));BalanceServiceImpl.save(ctx, listbalan.get(0));}}PayRsVo rs = new PayRsVo();rs.setBizType(payInfo.getBizType());if(payInfo.getBizType().equals("微信支付")) {rs.setOrderId(payInfo.getUserObject());}rs.setPhone(payInfo.getUserPhone());rs.setFillAmount(new BigDecimal(payInfo.getTotal_fee() / 100.00).setScale(2, BigDecimal.ROUND_HALF_UP));return rs;}public static Map _readStringXmlOut(String xml) {Map map = new HashMap();Document doc = null;try {doc = DocumentHelper.parseText(xml); // 将字符串转为XMLElement rootElt = doc.getRootElement(); // 获取根节点Iterator iter = rootElt.elementIterator(); // 获取根节点下的子节点head// 遍历head节点while (iter.hasNext()) {Element recordEle = (Element) iter.next();map.put(recordEle.getName(), recordEle.getData().toString());}} catch (Exception e) {throw new BaseException(e);}return map;}

微信公众号 h5微信充值功能相关推荐

  1. 微信公众号h5的分享功能

    微信公众号h5的分享功能配置如下: 微信配置 wx.config({debug,appId,timestamp,nonceStr,signature,jsApiList: ['onMenuShareA ...

  2. uniapp对接微信公众号H5微信支付、分享、小程序隐藏右上角分享胶囊

    1.导包 npm install jweixin-module --save 2.在创建wxApi.js文件,将方法封装在js文件里 /*微信(公众号)支付方法 */ const wx = requi ...

  3. 微信公众号:微信H5页面JSAPI充值

    微信公众号:微信H5页面JSAPI充值,遇到的一些坑,以及解决方式. 首先说一下微信充值分为很多种:目前我所涉及到的只是APP支付.H5支付.JSAPI支付. 区别: 1.根据不同场景 APP支付:是 ...

  4. 微信小程序webview清除缓存、微信公众号h5清除缓存、页面白屏、空白、不刷新问题

    一.缓存带来的问题和原因 我们在发布新版本的时候,在打开微信小程序webview嵌套的h5页面或微信公众号h5页面时,常常会发现页面还是上个版本的旧页面或者打开直接空白 白屏了,那么为什么会存在这个问 ...

  5. uniapp 开发微信公众号H5 隐藏右上角扩展按钮

    uniapp 开发微信公众号H5 隐藏右上角扩展按钮 1.首先使用npm安装一下微信的jsApi (这个应该都会吧 就跟vue使用npm安装依赖一样) 初始化: npm init -y 安装微信模块: ...

  6. 微信公众号 手机充值 html,怎么实现通过微信公众号给会员卡充值?

    现在的会员软件一般都支持储值功能,但是现在微信时代来了,如何微信上给自己的会员卡充值?怎么实现通过微信公众号给会员卡充值?相信很多会员软件服务商都没有办法.要实现这个功能需要三个前提条件,下面就分别给 ...

  7. Shopro商城 高级版 Fastadmin和Uniapp进行开发的多平台商城(微信公众号、微信小程序、H5网页、Android-App、IOS-App)

    Shopro商城无加密的开源源码(可用于自营+外包项目(多主体).可用于外包定制开发项目) shopro 商城,一款基于 uni-app 的前端模板商城.目前适配了(小程序+app+h5+公众号). ...

  8. Shopro商城,基于Fastadmin和Uniapp进行开发的多平台(微信公众号、微信小程序、H5网页、Android-App、IOS-App)购物商城

    Shopro商城 基于Fastadmin和Uniapp进行开发的多平台(微信公众号.微信小程序.H5网页.Android-App.IOS-App)购物商城,拥有强大的店铺装修.小程序直播.自定义模板. ...

  9. 微信公众号H5点击图片预览(可放大缩小),用微信内置jssdk实现

    在微信公众号H5里面可能会遇到点击图片预览,还可以放大缩小,微信内置有这个功能可以实现 用vue写项目的话,先 cnpm install weixin-js-sdk --save 接着给图片一个点击事 ...

最新文章

  1. 特征筛选(随机森林)
  2. Cortex-A、Cortex-R、Cortex-M处理器的性能比较
  3. HTTPS从认识到线上实战全记录
  4. 一分钟明白各种SQL语句加的什么锁——《深究Mysql锁》
  5. python语音规划路线_重新规划路线(python)
  6. 奇迹觉醒qq服务器比微信少,十年内最大的奇迹!功能比QQ还少的微信为什么能成功?...
  7. 软件正版,我们是缺钱还是缺意识
  8. [转]Insert, Update, and Delete Destination table with SSIS
  9. vs2008+sp1
  10. 自己经常测试,不要等别人发现系统死了
  11. CentOS6.5使用rsync远程同步
  12. 【WPF】鼠标穿透窗口(类似于桌面歌词那样子)
  13. CMD 命令行实现 Windows 下复制文件到文件夹下的所有文件夹
  14. Axure 软件自带的图标元件Icons无法显示的问题解决方法
  15. tesseract-ocr验证码识别
  16. C++笔试题目大全(笔试宝典)
  17. 专升本第七部分 计算机网络基础与网页设计
  18. 太阳直射点纬度计算公式_高中地理——每日讲1题(太阳直射点、太阳高度角、太阳视运动)...
  19. CTFWeb——Bugku秋名山老司机 详细题解
  20. Java开发常用在线工具

热门文章

  1. 强大的web电子表格控件dhtmlxSpreadsheet免费下载地址
  2. 模拟生态圈_模拟器之争 夜神构建手游PC化生态圈
  3. mysqldump和XBK备份
  4. 来人!把朕的线性代数呈上来!
  5. 博主在阿里笔试中拿了0分,竟是因为分不清楚 Java 输入类 nextLine 与 next 两个方法的区别
  6. 985毕业的“搬砖人”,从“挂科废材”到程序员,这样的意外崛起,他到底经历了什么?
  7. Quality Tools for Android
  8. Java面向对象8——抽象类和抽象方法(知识点+使用方法)
  9. 汇顶数字设计验证笔试题
  10. Activiti 5 提示:Default sequenceflow has a condition, which is not allowed