微信小程序与后台PHP交互的方法实例分析


Posted in Javascript onDecember 10, 2018

本文实例讲述了微信小程序与后台PHP交互的方法。分享给大家供大家参考,具体如下:

接下来将讲后台如何与前台进行数据及图片之间的交互,相信这一点是很多人所关注的,因为当时我实在团队中负责后台开发,因此对前端不是特别了解,这里我会贴出前端开发时的部分代码截图,微信小程序的官方api介绍地址是:

https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-network.html

微信与后台服务器之间的数据通信是调用wx.request(OBJECT)实现的,官方api接口里有对此说明,

例如前台向后台发送数据,需要链接服务器php作用路径下的具体php文件,并以key-value形式封装json格式数据,请看以下代码:

微信小程序与后台PHP交互的方法实例分析

url是服务器的域名及isbn.php在服务器的位置,这个位置是相对位置,在我上一篇购买的镜像里默认php文件路径为:

/yjdata/www/ ,这就意味着直接放在这个文件夹下的php只需要在域名后直接/+*.php即可,如果为了方便管理在这个目录下建了一个文件夹则在域名后/文件夹名字/*.php即可。

此外前端向后台传输的数据是以json格式封装的,如图中的data里写的数据,前面是key,后面是具体的value值,后台取得时候是要根据前面的key值取值,此外,method决定了后台与前台通过什么方式交流,这里是用的GET方法,后台与前台方法必须配对使用,不能一个是GET,另一端是POST,在做微信支付功能时,有些安全性隐私性较高的数据必须采用POST进行交互。

这里的前端向后台传输的result是图书的ISBN码,因为我们做的小程序有个功能是调用相机扫描书本后面的条形码从而获得ISBN码,前端将ISBN码发送到后台,后台程序将调用第三方豆瓣图书接口来依据ISBN码查询图书信息,并将图书信息返回给前台,这里我贴出服务器端的代码供大家参考:

<?php
$result=$_GET["result"];/*获取前端微信小程序扫书的isbn结果*/
/*与第三方接口通信获取书本信息*/
$book_info=file_get_contents("https://api.douban.com/v2/book/isbn/:".$result);
$jsondecode = json_decode($book_info,true);/*将获取到的书本信息JSON解码*/
$title=$jsondecode["title"];/*将解码后书名赋值给title变量*/
$author=$jsondecode["author"];/*将解码后作者赋值给author变量*/
$publisher=$jsondecode["publisher"];/*将解码后出版社名赋值给publisher变量*/
echo "title=".$title; /*向前端返回书名*/
echo "author=".$author; /*向前端返回作者名*/
echo "publisher=".$publisher; /*向前端返回出版社名*/
?>

具体的注释都写得很详细,向前台返回数据则直接用echo即可,一般开发都要与数据库打交道,因此,后台程序就需要依据前台传来的数据对数据库进行操作,这一部分其实也就是接受前台的数据,执行对应的数据库操作,这一部分只要是讲到php数据库操作的都会有,这里我不再进行过多阐述。

此外,对于一个微信小程序来说,图片是必不可少的,而图片资源都是存储在服务器中的,因此如何对图片进行存储是一个关键。接下来将结合一个书本信息的具体插入数据库的过程来进行讲解。。。(其实注释特别详细)

<?php
header('content-type:application/json;charset=utf8');
$mysql_server_name="localhost";/*数据库服务器名称*/
$mysql_username="root";/*数据库用户名*/
$mysql_password="123456";/*数据库用户密码*/
$mysql_databasename="zhishu";/*进入数据库后数据库名*/
$conn=mysqli_connect($mysql_server_name,$mysql_username,$mysql_password,$mysql_databasename);/*数据库连接语句*/
$bookname=$_POST["bookname"];/*从小程序前端获取书本名字*/
$authorname=$_POST["authorname"];/*从小程序前端获取书本作者名字*/
$bookintroduce=$_POST["introduce"];/*从小程序前端获取书本介绍信息*/
$bookholder_name=$_POST["openid"];/*从小程序前端获取书本持有人昵称*/
$bookclass=$_POST['classification'];;/*从小程序前端获取书本分类*/
date_default_timezone_set('PRC'); /*设置默认时区为中国*/
$time=(string)date("Y-m-d-h-i",time());/*获取时间*/function Unioname($a) /*将时间格式更改的函数*/{
  $a=explode('-',$a);
  $a=implode('',$a);
  return $a;
}
$time=Unioname($time);
$allowedExts = array("gif", "jpeg", "jpg", "png"); /*这里的内容同用户注册时代码含义一样,只不过那时是为了存用户头像并修改用户头像名字,这里是存书本图像并修改书本图像的名字*/
$temp = explode(".", $_FILES["file"]["name"]);//将图片名字以.分割成两个字符串
$extension = end($temp);   // 获取图片后缀名
if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
  && ($_FILES["file"]["size"] < 1024000)  // 小于 1MB
  && in_array($extension, $allowedExts))
{
  if ($_FILES["file"]["error"] > 0) {
    echo "错误:: " . $_FILES["file"]["error"] . "<br>";
  } else {
    // 判断当期目录下的 upload 目录是否存在该文件    // 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
    if (file_exists("bookimage/" . $_FILES["file"]["name"])) {
      echo $_FILES["file"]["name"] . " 文件已经存在。 ";
    } else {
      // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下      move_uploaded_file($_FILES["file"]["tmp_name"], "bookimage/".$_FILES["file"]["name"]);
      $oldname = "bookimage/" . $_FILES["file"]["name"];
      $newname = "bookimage/" . $time .$bookholder_name.".".$extension;
      rename($oldname, $newname);
      $sql_num="select * from book";
      $reasult=mysqli_query($conn,$sql_num);
      $reasult_num=mysqli_num_rows($reasult); /*将获取到书本信息插入数据库语句*/      $sql_insert="insert into book (book_id,bookname,authorname,book_intro,bookclass,bookholder_openid,bookpicture_path,is_CunZai,ChengJiao_num) VALUES ($reasult_num+1,'$bookname','$authorname','$bookintroduce','$bookclass','$bookholder_openid','$newname','1',0)";
      if( mysqli_query($conn,$sql_insert))
      {
        echo "插入书籍成功!";
      }
      else
      {
        echo "插入失败";
      }
    }
  }
}
mysqli_close($conn); /*关闭数据库连接*/
?>

首先使用$[FILE]全局数组接受文件,其拥有的几个属性如下:

$_FILES["file"]["name"] - 被上传文件的名称
$_FILES["file"]["type"] - 被上传文件的类型
$_FILES["file"]["size"] - 被上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] - 由文件上传导致的错误代码

这是一种非常简单文件发送及接收方式,接收到以后对文件名字进行以“.”进行分割,这是为了获取后缀,接下来要对后缀进行判断,看是否是常用的图片后缀格式,如果是并且图片大小小于1MB,则进行接下来的操作,此时图片位于缓存区,因此必须将图片改名后存于图书图片的文件夹下,这一部分在代码里有实现,此外,还需要将图片的路径与该图书其他信息一起存到数据库里。到这里基本小程序与后台大部分能用到的交互我都在这里讲了,基本可以完成一个简单的小程序。

希望本文所述对大家微信小程序开发有所帮助。

Javascript 相关文章推荐
Javascript模块模式分析
May 16 Javascript
JavaScript的类型简单说明
Sep 03 Javascript
JS操作Cookies的小例子
Oct 15 Javascript
浅谈jQuery hover(over, out)事件函数
Dec 03 Javascript
基于JQuery及AJAX实现名人名言随机生成器
Feb 10 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
Mar 15 Javascript
Node.js 回调函数实例详解
Jul 06 Javascript
Vue.js弹出模态框组件开发的示例代码
Jul 26 Javascript
关于Vue实现组件信息的缓存问题
Aug 23 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
Dec 08 Javascript
JavaScript动态加载重复绑定问题
Apr 01 Javascript
jQuery操作cookie的示例代码
Jun 05 jQuery
引入外部js脚本加载慢与页面白屏问题的解决
Dec 10 #Javascript
JQuery Ajax执行跨域请求数据的解决方案
Dec 10 #jQuery
发布Angular应用至生产环境的方法
Dec 10 #Javascript
webpack优化的深入理解
Dec 10 #Javascript
BootStrap模态框闪退问题实例代码详解
Dec 10 #Javascript
详解为生产环境编译Angular2应用的方法
Dec 10 #Javascript
深入理解Vue.js轻量高效的前端组件化方案
Dec 10 #Javascript
You might like
十天学会php之第六天
2006/10/09 PHP
第四节--构造函数和析构函数
2006/11/16 PHP
PHP 一个页面执行时间类代码
2010/03/05 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
2015/12/31 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
js制作简易年历完整实例
2015/01/28 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
2018/07/10 Javascript
JavaScript私有变量实例详解
2019/01/24 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
使用Python解析JSON数据的基本方法
2015/10/15 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
2019/08/05 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
2019/08/07 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
python3 简单实现组合设计模式
2020/07/02 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
会计实习期自我鉴定
2013/10/06 职场文书
追悼会主持词
2014/03/20 职场文书
商务日语专业自荐信
2014/04/17 职场文书
幼儿园课题方案
2014/06/09 职场文书
python 命令行传参方法总结
2021/05/25 Python
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技