2018-05-09 15:04:57 qq_38455201 阅读数 12870
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27821 人正在学习 去看看 秦子恒

我们在做微信开发的时候,有一个很重要的就是通过openid获取用户的详细信息,包含昵称,头像,省,市,区的信息,但是现在移动时代,很多人追求个性,在名字当中大量使用火星文或者表情符。(本人实际测试过一个20w+用户的公众号,昵称,省市区的信息都有可能包含特殊字符,暂时不了解为什么省市区都出现特殊字符的情况)这给微信开发带来了一些问题,我们在获取昵称之后保存到mysql数据库当中去就会出现错误。

下面三种解决办法:

1.取到了用户的昵称,把含有特殊字符的信息过滤掉然后进保存,好处是简单,坏处是会损失昵称细节,在非常不严格的情况下,才能够使用。

nickname.replaceAll("[\ue000-\uefff]","");

2.对mysql进行特殊设置,好处是你设置了好了之后可以一劳永逸的解决问题,坏处是可能会影响mysql的性能,并且假如你的数据库,表已经建立好,修改起来比较麻烦。

第一步:找到你的mysql的配置文件,一般叫my.cnf,打开之后全局搜索 character 关键词,可以搜索出很包含这个字符的信息,这个是设置字符编码的,让他们的值都等于utf8mb4,例如:default-character-set=utf8mb4。

第二步:修改表列的字符集,把你现有表的字符集全部改为utf8mb4编码。

第三步:JDBC数据库连接

jdbc:mysql://localhost:3306/mediamall?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true

3.也是我现在采用的方法,就是把nickname查出来,然后对nickname进行编码,编码完成之后保存到数据库当中。这样做的好处是不会损失细节,方便操作,只需要对数据进行一行代码的编码,坏处是直接用navicat打开表的时候nickname就看不懂了,并且在用到nickname的时候一定要记得先进行解码。

 import org.apache.commons.codec.binary.Base64;
 String nickname = jsonObject.getString("nickname");//jsonObject对象是查询出来的用户信息转化为json对象,用的是阿里巴巴的fastjson
 //进行编码
 nickname =Base64.encodeBase64String(nickname.getBytes("UTF-8"));
 //进行解码
 nickname = new String(Base64.decodeBase64(nickname),"UTF-8");

假如数据需要在HTML页面进行Base64编码和解码,可以用上下面的方法:

        /**
         * Base64 encode / decode
         */
        function Base64() {
            // private property
            _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

            // public method for encoding
            this.encode = function (input) {
                var output = "";
                var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
                var i = 0;
                input = _utf8_encode(input);
                while (i < input.length) {
                    chr1 = input.charCodeAt(i++);
                    chr2 = input.charCodeAt(i++);
                    chr3 = input.charCodeAt(i++);
                    enc1 = chr1 >> 2;
                    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                    enc4 = chr3 & 63;
                    if (isNaN(chr2)) {
                        enc3 = enc4 = 64;
                    } else if (isNaN(chr3)) {
                        enc4 = 64;
                    }
                    output = output +
                        _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
                        _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
                }
                return output;
            }

            // public method for decoding
            this.decode = function (input) {
                var output = "";
                var chr1, chr2, chr3;
                var enc1, enc2, enc3, enc4;
                var i = 0;
                input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
                while (i < input.length) {
                    enc1 = _keyStr.indexOf(input.charAt(i++));
                    enc2 = _keyStr.indexOf(input.charAt(i++));
                    enc3 = _keyStr.indexOf(input.charAt(i++));
                    enc4 = _keyStr.indexOf(input.charAt(i++));
                    chr1 = (enc1 << 2) | (enc2 >> 4);
                    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                    chr3 = ((enc3 & 3) << 6) | enc4;
                    output = output + String.fromCharCode(chr1);
                    if (enc3 != 64) {
                        output = output + String.fromCharCode(chr2);
                    }
                    if (enc4 != 64) {
                        output = output + String.fromCharCode(chr3);
                    }
                }
                output = _utf8_decode(output);
                return output;
            }

            // private method for UTF-8 encoding
            _utf8_encode = function (string) {
                string = string.replace(/\r\n/g, "\n");
                var utftext = "";
                for (var n = 0; n < string.length; n++) {
                    var c = string.charCodeAt(n);
                    if (c < 128) {
                        utftext += String.fromCharCode(c);
                    } else if ((c > 127) && (c < 2048)) {
                        utftext += String.fromCharCode((c >> 6) | 192);
                        utftext += String.fromCharCode((c & 63) | 128);
                    } else {
                        utftext += String.fromCharCode((c >> 12) | 224);
                        utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                        utftext += String.fromCharCode((c & 63) | 128);
                    }

                }
                return utftext;
            }

            // private method for UTF-8 decoding
            _utf8_decode = function (utftext) {
                var string = "";
                var i = 0;
                var c = c1 = c2 = 0;
                while (i < utftext.length) {
                    c = utftext.charCodeAt(i);
                    if (c < 128) {
                        string += String.fromCharCode(c);
                        i++;
                    } else if ((c > 191) && (c < 224)) {
                        c2 = utftext.charCodeAt(i + 1);
                        string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                        i += 2;
                    } else {
                        c2 = utftext.charCodeAt(i + 1);
                        c3 = utftext.charCodeAt(i + 2);
                        string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                        i += 3;
                    }
                }
                return string;
            }
        }
//1.加密  
var str = '需要加解密的内容';  
var base = new Base64();  
var result = base.encode(str);   
  
//2.解密  
var result2 = base.decode(result);  
以上是我的个人总结,推荐大家使用第三种方式,对数据进行编码然后保存,需要使用对数据进行解码,这样不会损失细节,也不影响数据库当中的其他数据。



2018-04-24 10:07:12 cslp517 阅读数 2593
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27821 人正在学习 去看看 秦子恒

前几天更新到最新版的微信开发工具后,发现在修改js或者wxml的时候,保存编译,页面内容不变化,只有关闭开发工具再重新打开才行

问题别人也遇到了:

https://developers.weixin.qq.com/blogdetail?action=get_post_info&lang=zh_CN&token=&docid=ac32eb457624a677b65078222a537d06

下面有人回复:


我正好用的也是win10+onedrive,但是我关闭了onedrive还是没用,然后突然想到,我的代码目录是一个映射目录,当时是为了onedrive同步方便,我将代码文件放在D:\OneDrive\工作\项目,然后用了mklink命令将这个目录映射到了D:\当前项目,最后将代码换个正常文件夹,重新打开开发工具,就能正常保存了。

2018-10-22 09:59:36 weixin_41695965 阅读数 5013
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27821 人正在学习 去看看 秦子恒

微信开发 — 调用微信上传图片接口,并保存到自己的服务器

整体思路是这样的:
1.先把手机上的图片上传到微信服务器,然后返回一个图片ID
2.在通过后台根据ID从微信后台拿到流,保存到服务器
前几个步骤在之前的博客上有提到调通wx.config{}
js

$.ajax({
		type : "post",
		url : "wx/sys.do", //之前的博客上有写到
		data : {
			"url" : location.href.split('#')[0]
		},
		dataType : "json",
		success : function(data) {
			wx.config({
				debug : false, // 开启调试模式   
				appId : data.data.appId,
				timestamp : data.data.timestamp,
				nonceStr : data.data.nonceStr,
				signature : data.data.signature,
				jsApiList : [ 'checkJsApi', 'uploadImage', 'chooseImage' ]
			// 必填,需要使用的JS接口列表,所有JS接口列表见附录2 
			});
			wx.error(function(res) {
				alert("出错了:" + res.errMsg);//这个地方的好处就是wx.config配置错误,会弹出窗口哪里错误,然后根据微信文档查询即可。
			});

			wx.ready(function() {
				wx.checkJsApi({
					jsApiList : [ 'chooseImage' ],
					success : function(res) {

					}
				});
			});
			//点击按钮
			$("#scanQRCode").click(function() {
				wx.chooseImage({
					count : 1, // 默认9
					sizeType : [ 'original', 'compressed' ], // 可以指定是原图还是压缩图,默认二者都有
					sourceType : [ 'album', 'camera' ], // 可以指定来源是相册还是相机,默认二者都有
					success : function(res) {
						var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
						localIdArr = localIds;
						uploadImg(localIds);
					}
				});
			});

		}
	});

	var int = 0;
	var serverIdArr = new Array();
	var localIdArr = new Array();
	function uploadImg(localIds) {//上传成功,微信服务器会返回一个本地ID,可以预览
		wx.uploadImage({//根据本地ID获得微信服务器ID
			localId : localIds[int].toString(), // 需要上传的图片的本地ID,由chooseImage接口获得
			isShowProgressTips : 1, // 默认为1,显示进度提示
			success : function(res) {
				var serverId = res.serverId; // 返回图片的服务器端ID
				var id = $('#id').val();//id
				$.ajax({
					type : "post",
					//这个方法很重要
					url : "wx/upload.do?mediaId=" + serverId + "&id=" + id,//mediaId这个就是微信返回的id传到后台
					data : {
					//data: {"mediaId": serverId},  
					},
					dataType : "json",
					success : function(msg) {
						if (msg.code == 1) {
							top.layer.msg("上传成功!", {
								icon : 6
							});
							location.reload();
						} else {
							lock = true;
							top.layer.msg(msg.msg, {
								icon : 5
							});
						}
					}
				});

			}
		});
	}

jsp
因为框架不同 样式可能不太一样
我这个上传成功后刷新页面从服务器取一下上传的图片

<div class="layui-input-block" style="margin-top: 10px; margin-bottom: 10px; display: block;" id="divy">
			<img <c:if test="${url.url == null}">src="images/null.jpg" </c:if> src="/${url.url}" width="160px" height="150px" />
</div>
<div class="layui-input-block" style="margin-top: 10px; margin-bottom: 10px;">
			<button class="layui-btn layui-btn-normal" id="scanQRCode" style="text-align: center; background-color: #ff4e00; width: 160px;">上传微信二维码</button>
</div> 

Controller

/**
	 * @Method 微信图片下载到服务器
	 * @author 
	 * @throws Exception
	 * @createTime
	 */
	@ResponseBody
	@RequestMapping("upload")
	public JsonBean upload(String mediaId, HttpServletRequest servletRequest, HttpServletRequest request, int id) throws Exception {
		InputStream input = null;
		FileOutputStream output = null;
		try {
		// 从微信获取的流,这个utils就是根据返回mediaId后去流的
			input = picDownload.getInputStream(mediaId);
			String path = "qr";
			File folder = new File(uploadFilePath + path);
			if (!folder.exists()) {
				folder.mkdirs();
			}

			File targetFile = new File(folder, new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + ".jpg");
			output = new FileOutputStream(targetFile);
			IOUtils.copy(input, output);
            //上边就是把图片保存到服务器里
            //下边是数据库的一些操作
			// 如果数据库有就删除
			QrMe qrMe = qrMeService.selectTeacherId(id);
			if (qrMe != null) {
				qrMeService.deleteUrl(id);
				new File(uploadFilePath + qrMe.getUrl()).delete();
			}

			// 添加数据库
			QrMe newQrMe = new QrMe();
			newQrMe.setUrl(path + "/" + targetFile.getName());
			newQrMe.setTeacherid(id);
			return qrMeService.insertQR(newQrMe);
		} finally {
			IOUtils.closeQuietly(input);
			IOUtils.closeQuietly(output);
		}
	}

utils

package com.admin.commons.utils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class PicDownload {

   //微信接口 
	@Autowired
	private WeiXinUtils weiXinUtils;
	
	/**
	 * 根据文件id下载文件
	 * 
	 * @param mediaId 媒体id
	 * @throws IOException
	 * @throws Exception
	 */
	public InputStream getInputStream(String mediaId) throws IOException {
		InputStream is = null;
		String url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=" + weiXinUtils.getAccessToken() + "&media_id=" + mediaId;  根据AccessToken获取media

		try {
			URL urlGet = new URL(url);
			HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
			http.setRequestMethod("GET"); // 必须是get方式请求
			http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			http.setDoOutput(true);
			http.setDoInput(true);
			System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
			System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
			http.connect();
			is = http.getInputStream();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return is;
	}

	/**
	 * 获取下载图片信息(jpg)
	 * 
	 * @param mediaId 文件的id
	 * @throws Exception
	 */

	public void saveImageToDisk(String mediaId) throws Exception {
		InputStream inputStream = getInputStream(mediaId);
		byte[] data = new byte[1024];
		int len = 0;
		FileOutputStream fileOutputStream = null;
		try {
			fileOutputStream = new FileOutputStream("test1.jpg");
			while ((len = inputStream.read(data)) != -1) {
				fileOutputStream.write(data, 0, len);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			if (fileOutputStream != null) {
				try {
					fileOutputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

刚开始接触这个功能,在网上找了很多资料踩了很多坑,图片不是直接上传到服务器的,而是先上传到微信的服务器,然后再下载到自己的服务器
前台我用的是layui框架

2017-03-28 16:45:49 incloud_anke 阅读数 297
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27821 人正在学习 去看看 秦子恒

1.微信开发原理
微信客户端->微信服务器->开发绑定的服务器。
微信开发步骤:
1、填写服务器配置
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑(入口为公众号后台设置的url)


2.微信验证服务器原理(验证服务器的有效性)
在微信公众后台配置的url和token保存之后会发一个GET请求到我们配置的url上。
并且携带四个参数用来验证签名:
验证签名成功之后把随机字符串返回给微信服务器。即可完成验证。


3.微信开发两种开发模式:

1.消息处理(主动接口、被动接口)
此类开发入口是在后台填写的url (被动接口微信服务器会将消息或者事件主动推送到我们绑定的服务器上)
2.h5页面(类似活动、游戏等要分享朋友圈或者好友来参加的活动)
此类开发主要是为了通过活动等获取粉丝来达到推广和传播的作用,所以第一步要 网页授权 来获得微信用户的openid来记录用户信息,其次要用到jssdk里的分享等接口来达到传播的效果!


4.微信开发access_token的总结

1.接口access_token:
接口调用的access_token。是对接口的认证!
获取方式:http请求方式: GET[https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET](https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET)
2.网页授权access_token(第三方h5页面分享获得用户数据用)
这个access_token是网页授权之后获得的access_token是为了获得授权之后拿到用户数据用的。
这个是微信服务器回调到后台填写的网页授权域名下!不是基本配置里的那个接收数据的那个url
https://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html


5.网页授权的总结
5.1.网页授权的步骤:

    1、引导用户进入授权页面同意授权,获取code
    2、通过code换取网页授权access_token(与基础支持中的access_token不同)
    3、如果需要,开发者可以刷新网页授权access_token,避免过期
    4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
 ```
5.2网页授权的两种方式 snsapi_base和snsapi_userinfo

1.用户已经关注公众号
snsapi_base:静默授权 得到code和openid 结束
snsapi_userinfo:静默授权 可以通过openid和access_token(可以通过code获取)获取用户数据
2.用户未关注公众号
snsapi_base:静默授权 得到code和openid 结束
snsapi_userinfo:弹出是否同意授权 可以通过openid和access_token(可以通过code获取)获取用户数据


---

>6.jssdk
>6.1 使用步骤:

1.绑定js安全域名(最多三个 支持二级域名 )
2.在页面引入js文件: 如需使用摇一摇周边功能,请引入 jweixin-1.1.0.js
3.配置接口调用权限验证(先获取jsapi_ticket 根据jssdk签名生成算法。)
4.调用对应的jssdk接口

>6.2 jsapi_ticket 和 api_ticket 区别

jsapi_ticket是用来验证jssdk签名。而api_ticket是用来验证jssdk里微信卡券的签名。


---

>7.UnionID机制

1.同一个微信用户在同一个微信公众号下openid是相同的。
同一个微信用户在不用的微信公众号下的openid是不同的。
2.在用户关注下通过openid和接口调用的access_token可以获取到用户的基本信息。
“`

2019-08-18 15:13:59 weixin_39589455 阅读数 346
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27821 人正在学习 去看看 秦子恒

js:

 baocun: function (e) {
    wx.showModal({
      title: '提示',
      content: '确定要保存这张图片吗?',
      success: function (res) {
        if (res.confirm) {
          console.log('用户点击确定')
          wx.getImageInfo({
            src: '../../images/QRcode_app.png',
            success: function (res) {
              console.log(res);
              var path = res.path;
              wx.saveImageToPhotosAlbum({
                filePath: path,
                success: function (res) {
                  console.log('图片已保存');
                },
                fail: function (res) {
                  console.log('保存失败');
                }
              })
            }
          });
        } else if (res.cancel) {
          console.log('用户点击取消')
        }
      }
    })
  },

wxml:

<view class="img" catchlongpress='baocun'>
  <image style=" " src="..."></image> 
</view>

微信开发

阅读数 288

没有更多推荐了,返回首页