为了在公众号页面中上传图片,需要配置微信jssdk。
各项配置操作流程,请参照微信官网:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115;
为了提高代码复用性,封装了一下上传图片类:
<?php
class WxUploadImg{
//1.获取access_token,7000秒内,读取文件存档,否则重新获取
function get_access_token_and_jsticket($appid,$appsecret){
$file_addr='./server/cache.text';
if(file_exists($file_addr)){
$content=file_get_contents($file_addr);
$content=json_decode($content);
$access_token=$content->access_token;
$jsticket=$content->jsticket;
$time_limit=$content->time_limit;
$arr['time_limit']=$time_limit;
$arr['access_token']=$access_token;
$arr['jsticket']=$jsticket;
if(time()<= $time_limit){
return $arr;
}else{
$file=fopen($file_addr,'w');
$time_limit=time()+7000;
$access_token=$this->get_new_access_token($appid,$appsecret);
$jsticket=$this->get_jsticket($access_token);
$arr=array();
$arr['time_limit']=$time_limit;
$arr['access_token']=$access_token;
$arr['jsticket']=$jsticket;
fwrite($file,json_encode($arr));
fclose($file);
return $arr;
}
}else{
$file=fopen($file_addr,'w');
$time_limit=time()+7000;
$access_token=$this->get_new_access_token($appid,$appsecret);
$jsticket=$this->get_jsticket($access_token);
$arr=array();
$arr['time_limit']=$time_limit;
$arr['access_token']=$access_token;
$arr['jsticket']=$jsticket;
fwrite($file,json_encode($arr));
fclose($file);
return $arr;
}
}
//随机字符串
function make_nonceStr() {
$codes=array();
$codeSet = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
for ($i = 0; $i<16; $i++) {
$codes[$i] = $codeSet[mt_rand(0, strlen($codeSet)-1)];
}
$nonceStr = implode($codes);
return $nonceStr;
}
//缓存过期,获取新的access_token
function get_new_access_token($appid,$appsecret){
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
$rurl = file_get_contents($url);
$rurl = json_decode($rurl,true);
if(array_key_exists('errcode',$rurl)){
return 'err1';
}else{
return $access_token = $rurl['access_token'];
}
}
//2.获取jsticket
function get_jsticket($access_token){
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi"; // 两小时有效
$rurl = file_get_contents($url);
$rurl = json_decode($rurl,true);//var_dump($rurl);return;
if($rurl['errcode'] != 0){
return 'err2';
}else{
$jsticket = $rurl['ticket'];
return $jsticket;
}
}
//3.获取 signature
function get_signature($jsticket,$timestamp,$noncestr,$url){
$string1 = 'jsapi_ticket='.$jsticket.'&noncestr='.$noncestr.'×tamp='.$timestamp.'&url='.$url;
return $signature = sha1($string1);
}
}
前端:
插入页面的php代码,以便页面配置wx.config
最容易出错的是获取当前页面的完整url,参数一个不能少,可用
alert(location.href.split('#')[0])查看当前url;
<?php
include 'wx_upload_img.php';//引入封装类
$wximg=new WxUploadImg();
$timestamp = time();
$appid='wxxxxxxxxxxx';
$appsecret ="xxxxxxxxxxxxxxxxxxx";
$url= 'http://wx.unair.cn/insure/etc_add.php?openid='.$_REQUEST['openid'];
$noncestr=$wximg->make_nonceStr();
$arr=$wximg->get_access_token_and_jsticket($appid,$appsecret);
$access_token=$arr['access_token'];
$signature=$wximg->get_signature($arr['jsticket'],$timestamp,$noncestr,$url);
?>
js部分
<script>
//alert(location.href.split('#')[0])
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId:"<?php echo $appid; ?>" , // 必填,公众号的唯一标识
timestamp:"<?php echo $timestamp; ?>" , // 必填,生成签名的时间戳
nonceStr: "<?php echo $noncestr; ?>", // 必填,生成签名的随机串
signature: "<?php echo $signature; ?>",// 必填,签名
jsApiList: [
'chooseImage',
'uploadImage'
] // 必填,需要使用的JS接口列表
});
function chooseImage(obj){
var id=$(obj).attr('id');
// 选择张片
wx.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function(res) {
var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
// $(obj).attr('src', localIds);
// 上传照片
wx.uploadImage({
localId: '' + localIds,
isShowProgressTips: 1,
success: function(res) {
serverId = res.serverId;
$(obj).attr(id,serverId); // 把上传成功后获取的值附上
var img = '<img src="' +localIds+ '" style="width: 180px;height:130px;"/>';
$("#"+id).empty();
$("#"+id).append(img);//显示选中的图片
var url="http://wx.unair.cn/insure/server/download_wx_img.php";
$.get(url,{access_token:access_token,media_id:serverId},function (data) {
alert(data);//从微信服务器获取图片到本地,后台脚本就不提供了
});
}
});
}
});
}
<html>部分
<div class="main_in_input_image_label">请上传正反面身份证照片:</div>
<div οnclick="chooseImage(this)" id="idcardimg1" class="main_in_input_image_pit" style="float: left;">
<span id="jiajia" style="font-size:105px;">+</span>
</div>