2018-02-03 09:43:54 yji534123343 阅读数 913
  • 微信支付开发-微信公众号开发12-微信开发php

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

    27820 人正在学习 去看看 秦子恒
一、微信开发的整体介绍
开放平台:https://open.weixin.qq.com/
公众平台:https://mp.weixin.qq.com/
1、微信开发的种类
①移动应用开发
支持微信的分享、收藏、支付三大功能,原生开发的人员去使用的开发类别
②网站应用开发
网站支持使用微信账号进行注册和登录,从而来实现:提高用户的留存率,方便不同账号的统一(结合unionId)
③公众账号开发


④公众账号第三方平台
优势在于免繁琐设置,方便小白用户去使用。


2、公众账号开发
①服务号
主要偏向于给用户提供查询服务(招商银行、麦当劳。。)
显示在好友列表,每个月只能群发4条消息


②订阅号
主要偏向于给用户提供资讯(朝闻天下、Web前端。。)
显示在订阅号文件夹内,每天都可以群发1条消息


③小程序
2017年1月9号 (2007年1月9号 推出iphone)
基于微信的平台,ui提供了很多组件,js提供了很多接口


(微信官方的小程序:小程序示例,包含了微信官方封装好的组件、以及封装好的接口)


目标:万物互联 (IOT),  二维码
开放范围:(不包含个人)
http://www.wxapp-union.com/forum.php?mod=viewthread&tid=495


https://mp.weixin.qq.com/debug/wxadoc/dev/index.html


数据存储和服务器:
两种解决方案 ①腾讯云(不到100) ②godaddy


④企业号
主要是建立起 企业与人的关系,提供信息、和企业相关的定制功能


温馨提示:
1)如果想简单的发送消息,达到宣传效果,建议可选择订阅号;
2)如果想进行商品销售,进行商品售卖,建议可申请服务号;
3)如果想用来管理内部企业员工、团队,对内使用,可申请企业号。
4)订阅号可通过微信认证资质审核通过后有一次升级为服务号的入口,升级成功后类型不可再变。
5)服务号不可变更成订阅号。


3、九大类高级接口


语音识别接口
客服接口
OAuth2.0 网页授权接口
生成带参数的二维码接口
获取用户地理位置接口
获取用户基本信息接口
获取关注者列表接口
用户分组接口
上传下载多媒体文件接口


+ 微信支付
(十大类接口的使用,必须是认证过的服务号和订阅号才能使用)




4、正式环境的搭建
(公众账号-》订阅号)


购买自己的域名(万网、dnsPod、godaddy)
购买申请主机空间(新浪云、阿里云、腾讯云、大米云、godaddy、aws)
注册订阅号
登录到订阅号管理接口、服务器的配置、调用10大类接口


5、测试环境的搭建
(公众账号-》订阅号)


主机空间(新浪云)
注册订阅号
登录到订阅号管理接口、服务器的配置、调用10大类接口


6、注册订阅号
①填写邮箱、密码
②到邮箱中激活账号
③选择类型
④登记信息(个人、组织、媒体、企业。。)
⑤填写公众号的信息(名称、介绍、头像)






二、个人订阅号(jssdk)


1、实现功能:统计页面被访问的次数


分析:
①存储需要持久保存的数据
数据库、文件系统、内存中:fileSystem
②读写过程
读:file_get_contents($fileUrl);
写:file_put_contents($fileUrl,$content);


需要apache启动


2、新浪云storage


通过bucket管理我们的文件,如何访问?
saestor:// testbucket/count.txt




3、jsSDK的使用步骤
①绑定域名
②引入js文件
③注入接口(将使用接口的名称,写在config方法中jsAPIList这个数组中)
④在ready中调用接口
⑤在error中处理失败的异常情况






sample.zip有4个文件,
前两个文件都是用来存储数据的,jssdk.php进行网络请求以及数据的读写操作,sample.php文件主要完成接口的注入和调用


jssdk.php封装了2个方法get_php_file、set_php_file,如果部署在服务端,写文件会出现权限拒绝的问题。
①将存储文件 放到新浪云的bucket中
②修改读写文件的路径为 saestor://bucketName/**.php




require subscribe 需要订阅测试账号。




三、版本控制工具(git)


1、版本控制
记录一个或者多个文件内容变化,以便于未来查询指定的版本信息。


svn 集中式/git  分布式
①防止代码的丢失
②团队协作
③版本还原
④更好的管理代码


2、git介绍
用于代码的版本控制,使用方式:命令行/图形化


git(分布式版本控制工具)与github(托管开源项目的网站,托管项目的方式采用的是git)


3、自己使用git将项目上传到github


①申请github的账号 
https://github.com/
注册账号,在选择计划的时候选择continue,在编辑经验时选择skip跳过。
②去邮件激活账号
③start project 只需要指定repository的名称,点击create去创建。


④安装git
一路next,最后点击install安装 取消所有的勾选就可以了。
⑤启动git
到所有程序中,找到git,找到gitbash,点击启动


⑥基础命令
ls (list) 查看当前目录下的文件
clear 清除当前的屏幕信息
pwd (print the work directory)显示当前目录
mkdir web1609 在当前的路径中创建一个叫做web1609的目录
cd web1609 (change directory)
touch a.txt 创建一个叫做a.txt的一个文件


通过电脑中的文件系统找到文件,写上了hello git.


git的用法


git init 初始化仓库
git status 查看仓库的状态
git add a.txt 将a.txt添加到代码仓库
git commit -m '第一次提交'     添加到缓存区


配置上传到github上的用户信息:
git config --global user.name "web1609best"
git config --global user.email "web1609@vip.163.com"


设置完账号之后,重新提交到缓存区:
git commit -m '第一次提交'     添加到缓存区


将本地的代码设置它推送到github上的地址:
git remote add origin https://github.com/web1609best/web1609.git


将当前目录的git仓库推送到github对应的origin地址的master分支
git push origin master

















2016-11-15 11:38:46 qq_24091555 阅读数 20068
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

           由于项目需要,需要接触微信开发,并要调用微信的JS-SDK里面的接口。

       因为经验缺乏,我百度一下关于微信开发的资料,但收集的资料都不尽人意。网上的主流的微信开发是采用PHP开发的,而本人学的Java。所以对PHP微信开发只能看懂思路。更有的是,网上一些微信开发视频,也是和PHP有关的,关于用Java开发的甚少。

       无奈之下,我只好苦啃微信开发文档。大家都知道,微信官方给的开发文档真的有点那个啥,一个功能实现非要分几个地方来说,看完这块,又得点击另一个页面看完另一块,甚是麻烦。这样的设定也让我走了好多坑。

但功夫不负有心,在研究透了微信开发文档之后,我顺利在在项目中完成微信开发。现在我将微信开发的经验分享一下,希望对大家有所帮助。

       微信JS-SDK是微信公众号平台面向网页开发这提供基于微信内的网页开发工具包。接口大类分为:基础接口、分享接口、图像接口、音频接口、智能接口、设备信息、地址位置、摇一摇周边、界面操作、微信扫一扫、微信小店、微信卡劵和微信支付。一般使用频率高的就是分享接口、地理微信、微信扫一扫和微信支付。

接下来,我将主要讲解如何调用微信分享接口。

第一步,准备内网映射工具,ngrok。不清楚这个的同学可以去百度一下。https://ngrok.com为ngrok官网。要进行微信开发,内网映射工具是不可少。毕竟,我们程序员进行开发,要测试开发的产品是否能用,都先在自己的电脑跑一下。但由于ngrok的服务器在外国的,鉴于天朝的墙太高,访问可能不稳定。所以我推荐的是国内的natapp,免费和收费的都有,服务毕竟稳定可靠,只不过要想自定义二级域名就得交费成为VIP咯。

第二步,配置JS接口安全域名。登录要进行开发的公众号,点击公众设置--->功能设置。设置JS接口安全域名,要注意三点:①填写域名前面不需加上http://,例如你的域名是http://test.com,直接填写test.com即可;②域名默认80端口,只支持80和443端口,所以域名后面不能添加端口号。③该域名为你调用微信JS-SDK接口域名。

第三步,引用JS文件。在需要调用JS接口的页面引入http://res.wx.qq.com/open/js/jweixin-1.0.0.js 。


第四步,通过config接口注入权限验证配置 。具体参数有什么用处,在截图都有注释讲解。其中jsApiList为我们要使用的接口,我在下面共引用了五个接口,分别为微信好友分享、QQ好友分享、腾讯微博分享、QQ空间分享和朋友圈分享。调用的都是分享的接口。至于其他接口列表,可以去微信开发文档那浏览一下。这里就不详说。

        第五步,在服务器生成相关参数传到调用JS-SDK页面,完成授权。这是最重要的一步。如上图所示,appId,timestamp,nonceStr,signature都为必填参数。下面我将会详细说说如何生成这些参数并传回页面。

appId为开发的微信公众号的AppID(应用ID),我们可以在登录微信公众号,在开发选项中点击基本配置来查看。

timestamp为系统生成的时间戳。


nonceStr为服务器随机生成的字符串。



signature为微信JS-SDK使用权限算法。在生成signature之前,我们要拿到jsapi_ticket。官方文档是这样解释的:


我们要注意三个地方。jsapi_ticket要缓存两个小时,每过两个小时,向微信那边请求一次。获取jsapi_ticket要通过access_token。那么我们该如何获取access_token呢?


从文档可以看出,access_token需要AppID和AppSercet两个参数。而且access_token和jsapi_ticket一样,有效期皆为两小时。这就要求我们服务器要缓存access_token和jsapi_ticket,当有效期一过,就重新请求。有的人采用是用数据库来存取这两个参数,而我采用的是用Quartz定时器。关于Quartz定时器的使用,可浏览我上篇博客《SSH与Quartz集成》,里面有关于Quartz的使用方法。

AppSercet可在与APPID同一页面获取。接下来,调用接口,获取access_token。



接下来,我们用access_token去获取jsapi_ticket。


获取jsapi_ticket,就可以进行生成签名。在此之前,先看一下官方文档的签名算法。



用代码实现。


第六步,传生成的参数给网页。



第七步,调用已授权的JS接口。


第八步,利用微信Web开发者工具调试,看看是否授权成功。(微信web开发者工具可在微信开发下载)。



2018-06-22 11:11:36 qq_36500554 阅读数 1293
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

      今天整理一下微信开发中遇到的图片和附件的上传问题。

      开发环境参考:微信开发(一)--分享接口 点击打开链接

      由于是基于weixin-java-tools 封装的java sdk,所以在微信底层处理上我们可以直接调用WxMpService.

      .数据准备:

           进入页面前,根据条件查询相应的图片附件列表(已有数据时进行展示,没有数据可以忽略):

	           //查询图片数据  
		List<FileModel> imgList = fileModelService.loadFileModelsByBFTT(11);
		   //查询附件数据
		List<FileModel> attachmentFileList = fileModelService.loadFileModelsByBFTT(11);
		

      二.页面准备:    

            jspye页面设置上传按钮,遍历读取图片列表   

    <!-- 图片上传 -->   
				 <div class="form-group">
				    <div class="input-group">
				       <div class="input-group-addon "><span style="color:red;"> </span>图片上传:</div>
				       <input type="hidden" name="fileIds" id="fileIds">
				       <div class="input-group-addon">
				       	
				       				<a href="javascript:void(0)" onclick="chooseImage('${basePath }','${id}');">
						       			<span class="glyphicon glyphicon-plus"></span>
						       		</a>
				       
				       </div>
				    </div>
				  </div>
				  
				  <!-- 缩略图 -->
				  <ul class="body-img-ul">
				  		<c:forEach items="${imgList}" var="v" varStatus="sta">
				  			<li style="background-image:url('${simplePath }${v.revealpath }')" 
				  				onclick="previewImage('${simplePath }${v.revealpath }');">
				  		
					       		<i class="del_icon" onclick="deleteImage('${v.id }',this,'${basePath }')"></i>
		    	            </li>
				  		</c:forEach>
				  </ul>
				   <!-- 附件上传 --> 
				   <div class="form-group">
				    <div class="input-group">
				       <div class="input-group-addon "><span style="color:red;"> </span>附件上传:</div>
				       <div class="input-group-addon">
				       		<input type="hidden" name="attachmentIds" id="attachmentIds">
				       		
					       				<span class="glyphicon glyphicon-plus">
					       					<input type="file" class="attachmentFile" name="attachmentFile" id="attachmentFile"
						       				 onchange="uploadAttachment('${basePath }','${id}');"/>
					       				</span>
				       </div>
				    </div>
				  </div>
				  <!-- 附件 -->
				  <ul class="body-file-ul">
				  		<c:forEach items="${attachmentFileList }" var="v" varStatus="sta">
		    	            <li>
					  			<a href="${simplePath }${v.revealpath }">
					  				<c:choose>
			              		 		<c:when test="${fn:length(v.filename) < 20 }">
			              		 			${v.filename }
			              		 		</c:when>
			              		 		<c:otherwise>
			              		 			${fn:substring(v.filename,0,20) }....${v.extname }
			              		 		</c:otherwise>
			              		 	</c:choose>
					  			</a>
					
					       				<i class="del_icon" onclick="deleteImage('${v.id }',this,'${basePath }')"></i>
		    	            </li>
				  		</c:forEach>
				  </ul>
				<!-- 附件上传 -->  
				    

     三.初始化jssdk:  

          controller

@Controller
@RequestMapping("jssdk")
public class WeXinJsSdkController {
	
	@Autowired
	private WxMpService wxMpService;
	
	@RequestMapping(value = "/config", method = RequestMethod.GET)
	@ResponseBody
	public WxJsapiSignature wxJsSdkConfig(HttpServletRequest request,String url) {
		try {
			WxJsapiSignature wxJsapiSignature = wxMpService.createJsapiSignature(url);
			return wxJsapiSignature;
		} catch (WxErrorException e) {
			return null;
		}
	}
	  
}
  js请求获取config 参数 
	/* 初始化jssdk */
	$.get("${basePath}/jssdk/config.do",{url:window.location.href},function(data,status){
		if(status == "success"){
			wx.config({
			    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
			    appId: data.appId, // 必填,公众号的唯一标识
			    timestamp: data.timestamp, // 必填,生成签名的时间戳
			    nonceStr: data.nonceStr, // 必填,生成签名的随机串
			    signature: data.signature,// 必填,签名,见附录1
			    jsApiList: ['chooseImage', 'uploadImage', 'downloadImage', 'previewImage'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
			 
			});
			wx.ready(function(){
				//layer.msg("jssdk初始化成功");
			    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,
			    //所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
			});
			wx.error(function(res){
			    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,
			    //也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
				layer.msg(res);
			});
		}
		},"json");

  js 配置

    1. chooseImage    手机选择或拍摄图片 
    2. uploadImage    上传图片到微信服务器
    3. downloadImage  下载图片到本地

    previewImage   本地图片预览 


	
	//微信sdk上传图片------------------------
var images = {
	    localIds: [],
	    serverIds: [],
	  }; 
function chooseImage(basePath,id){
	wx.chooseImage({
	    count: 6, // 默认9
	    sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
	    sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
	    success: function (res) {
	    	images.localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
	    	//显示缩略图
	        for(var i=0;i<images.localIds.length;i++){
	        	var liLength = $(".body-img-ul li").length;
	        	if(liLength >= 6 ){
	        		layer.msg("最多允许上传6张图片!");
					return;
		        }
	        	var imgHtml = "<li style=\"background-image:url('"+images.localIds[i]+"')\"";
	        		   imgHtml += "onclick=\"previewImage('"+images.localIds[i]+"')\">";
	        		   imgHtml += "<i class=\"del_icon\"></i>";
	        		   imgHtml += "</li>";
	  				
	        	$(".body-img-ul").append(imgHtml);
		    }
		    //递归的上传图片
	        syncUpload(images.localIds,id);
	    }
	});
}
//将微信服务器的图片下载到本地
var syncUpload = function(localIds,id){
	var localId = localIds.pop();
	//上传图片到微信服务器
    wx.uploadImage({
        localId: localId, // 需要上传的图片的本地ID,由chooseImage接口获得
        isShowProgressTips: 1, // 默认为1,显示进度提示
        success: function (res) {
        	images.serverIds.push(res.serverId); // 返回图片的服务器端ID
            if(localIds.length > 0){
            	syncUpload(localIds,id);  
            }else if(images.localIds.length == 0){
            	var serverids = images.serverIds.join(',');
            	$.post(
            		basePath+"/fileupload/uploadImg.do",
            		{"serverIds":serverids,"id":id}
            		,function(data,status){
        			if(status == "success"){
        				images.serverIds = [];
        				//存储文件id到页面
        				setFileIds(data.join(','));
        				
        				var tempLen = $(".del_icon").length;
        				var dataLen = data.length;
        				var del_index;
        				var del_id;
        				for(var i = 1;i<dataLen+1;i++){
        					del_index = tempLen-i;
        					del_id = data[i-1];
        					addDeleteEvent(del_index,del_id,basePath);
        				}
        				layer.msg("上传成功!");
        			}
        	  },"json");
            }
        }
    });
 }
//添加事件
function addDeleteEvent(del_index,del_id,basePath){
	$(".del_icon").eq(del_index).click(function(e){
		deleteImage(del_id,this,basePath);
		window.event.cancelBubble = true;
	});
}
//添加上传的filemodeID
function setFileIds(fildIds){
	var temp = $("#fileIds").val();
	if(temp == ""){
		 $("#fileIds").val(fildIds)
	}else{
		$("#fileIds").val(temp+","+fildIds)
	}
}
//预览图片
function previewImage(url){
	document.write("url----"+url);
	 wx.previewImage({
         current: url, // 当前显示图片的http链接
         urls: [url] // 需要预览的图片http链接列表
	 });
}
//异步删除图片
function deleteImage(id,obj,basePath){
	$.ajax({
		  type: 'POST',
		  url: basePath+"/fileupload/deleteFile.do",
		  data:{"id":id},
		  dataType: 'json',
		  success: function(data){
			 if(data.state == 200){
				layer.msg("删除成功!");
				 //移除对应数据
				 $(obj).parent()[0].remove();
			 }else{
				 layer.msg("删除失败!");
			 }
		  }
		});
	 window.event.cancelBubble = true;
}
//微信sdk上传图片------------------------
//上传附件
function uploadAttachment(basePath,id) {
   //限制数量
	var liLength = $(".body-file-ul li").length;
	if(liLength >= 6 ){
		layer.msg("最多允许上传6份附件!");
		return;
    }
   //上传文件
   $.ajaxFileUpload({
       url: basePath+"/fileupload/uploadAttachment.do", //文件上传到哪个地址,告诉ajaxFileUpload
       data:{"bussinessId":bussinessId,"id":id},
       secureuri: false, //一般设置为false
       fileElementId: 'attachmentFile', //文件上传控件的Id  <input type="file" id="fileUpload" name="file" />
       dataType: 'json', //返回值类型 一般设置为json
       success: function (data, status){//服务器成功响应处理函数
    	   if(data.state == 200){
    		   var imgHtml = "<li>";
    		   imgHtml += "<a href=\""+basePath+data.data[2]+"\">"+data.data[1]+"</a>";
    		   imgHtml += "<i class=\"del_icon\" onclick=\"deleteImage('"+data.data[0]+"',this,'"+basePath+"')\"></i>";
    		   imgHtml += "</li>";
    		   $(".body-file-ul").append(imgHtml)
    		   //存储文件id到页面
    		   setFileIds(data.data[0]);
    	   }
		   layer.msg(data.msg);
       	}
       });
   };
	
.后台配置文件名称,设置本地存储路径,把相应数据存储到本地:  

@Controller
@RequestMapping("/fileupload")
public class FileUploadController {
	
	public String prefix ="yongjun/upload/";
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	@Autowired
	private WxMpService wxMpService;
	@Autowired
	private UsersService usersService;
	@Autowired
	private FileModelService fileModelService;
	@Value(value = "#{resourceProperties['uploadUrl']}")
	private String uploadUrl;
	
	@RequestMapping(value = "/uploadImg", method = RequestMethod.POST)
	@ResponseBody
	public String[] uploadImg(String serverIds,BigDecimal id,HttpServletRequest request){
		
		String[] result;
		//获取当前用户
		CurrentUser currentUser = usersService.getCurrentUser(request);
		try {
			String[] serverId_arr = serverIds.split(",");
			if(serverId_arr != null && currentUser != null){
				//图片存储
				List<FileModel> fileModelStorelist = new ArrayList<FileModel>();
				for (int i=0;i<serverId_arr.length;i++) {
					File file = wxMpService.getMaterialService().mediaDownload(serverId_arr[i]);
					String filePath = FileUploadUtil.uploadImg(file, uploadUrl, currentUser);
					//文件模型数据
					FileModel fileModel = new FileModel();
					fileModel.setCreatedTime(new Date());
					byte disabled = 0;
					fileModel.setDisabled(disabled);
					fileModel.setFilename(file.getName());
					fileModel.setRealname(file.getName());
					fileModel.setExtname(filePath.substring(filePath.lastIndexOf(".")+1));
					fileModel.setFilepath(filePath);
					fileModel.setRevealpath(filePath.replace("C:\\crm2009\\upload", "/myImg").replace("\\", "/"));
					fileModel.setFiletype("image");
					
					fileModelStorelist.add(fileModel);
				}
				result = fileModelService.storeFileModelList(fileModelStorelist);
				return result;
			}else{
				logger.info("当前用户不存在!!");
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.info("下载文件失败!!"+e.getClass());
			return null;
		}
		
		
	}
	@RequestMapping(value = "/uploadAttachment", method = RequestMethod.POST)
	@ResponseBody
	public ResultData uploadAttachment(BigDecimal bussinessId,BigDecimal id,HttpServletRequest request,MultipartFile attachmentFile){
		
		//判断文件类型
		String originalFilename = attachmentFile.getOriginalFilename();
		String[] imagType={".jpg",".png",".bmp",".gif"};
		List<String> imagTypeList = Arrays.asList(imagType);
		if(imagTypeList.contains(originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase())){
			return ResultData.error("无法上传图片!");
		}
		String[] result = new String[3];
		//获取当前用户
		CurrentUser currentUser = usersService.getCurrentUser(request);
		try {
			if(currentUser != null){
				//上传文件
				String filePath = FileUploadUtil.uploadFile(attachmentFile, uploadUrl, currentUser);
				//文件模型数据
				FileModel fileModel = new FileModel();
				fileModel.setCreatedTime(new Date());
				byte disabled = 0;
				fileModel.setBussinessid(bussinessId);
				fileModel.setDisabled(disabled);
				fileModel.setFilename(originalFilename);
				fileModel.setRealname(filePath.substring(filePath.lastIndexOf("/")+1));
				fileModel.setExtname(filePath.substring(filePath.lastIndexOf(".")+1));
				fileModel.setFilepath(filePath);
				fileModel.setRevealpath(filePath.replace("C:\\crm2009\\upload", "/myImg").replace("\\", "/"));
				fileModel.setFiletype("attachment");
				fileModelService.storeFileModel(fileModel);
				
				result[0] = fileModel.getId().toString();
				result[1] = fileModel.getFilename();
				result[2] = fileModel.getRevealpath();
				return ResultData.ok(result, "上传成功!");
			}else{
				logger.info("当前用户不存在!!");
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.info("下载文件失败!!"+e.getClass());
			return null;
		}
		
		
	}
	
	@RequestMapping(value = "/deleteFile", method = RequestMethod.POST)
	@ResponseBody
	public ResultData deleteFile(BigDecimal id){
		fileModelService.deleteFileModel(id);
		return ResultData.ok();
	}
	
}
.设置 文件转接工具类:

     

public class FileUploadUtil {
	/**
	 * 上传文件
	 * @param file 源文件
	 * @param uploadUrl 上传地址
	 * @param currentUser 当前用户
	 * @param fileType 
	 * @return
	 */
	public  static String uploadImg(File file,String uploadUrl,CurrentUser currentUser) {
		//处理待写入的位置
		if(currentUser != null){
			uploadUrl += "\\image\\" +currentUser.getLoginName().toString();
		}
		File uploadPosition = new File(uploadUrl);
		if(!uploadPosition.exists()){
			//文件路径不存在,则创建
			uploadPosition.mkdirs();
		}
		if (file.renameTo(new File(uploadPosition + "\\" + file.getName()))) {
            System.out.println("File is moved successful!");
        } else {
            System.out.println("File is failed to move!");
        }
		return uploadPosition + "/" + file.getName();
	}
	public  static String uploadFile(MultipartFile file,String uploadUrl,CurrentUser currentUser) throws UnsupportedEncodingException {
		//处理待写入的位置
		if(currentUser != null){
			uploadUrl += "\\attachment\\" +currentUser.getLoginName().toString();
		}
		File uploadPosition = new File(uploadUrl);
		if(!uploadPosition.exists()){
			//文件路径不存在,则创建
			uploadPosition.mkdirs();
		}
		String originalFilename = file.getOriginalFilename();
		String realName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
		try {
			file.transferTo(new File(uploadPosition + "\\" +  realName));
			System.out.println("File is moved successful!");
		} catch (IllegalStateException | IOException e) {
			e.printStackTrace();
			System.out.println("File is failed to move!");
		}
		return uploadPosition + "/" + realName;
	}
} 
   学习在于不断地探索、思考和总结记录,欢迎喜欢的朋友们在下方留言,与君共同进步!







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

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

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

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

整体思路是这样的:
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-09-20 10:10:20 towtotow 阅读数 596
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

在进行微信公众号开发时,

不可避免的会遇到程序出错,

但是微信开发跟本地开发不同,


7error_message.jpg


本地开发时,

你可以通过调整错误级别来显示错误提示,

方便你调试程序,

但是微信开发时是没有错误信息提示的。


这里应该怎么获取公众平台开发过程中的错误信息呢…

微信开发获取出错信息,进行错误调试视频教程在线观看

http://edu.csdn.net/course/detail/2586/40528

微信开发资源下载

阅读数 2227

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