(12)微信商城

① 前台模板引入

a.引入微信商城模板的css+js+Images+img+bootstrap

b.引入微商城的首页index.html及详情页detail.html页面模板

注意:修改js/css/image等的引入路径

c.控制器添加显示页面的方法

D:\phpStudy\WWW\wechat\tp3\Application\Shop\Controller\IndexController.class.php

d.访问控制器中的方法查看显示效果

http://zouke1220.oicp.net/wechat/tp3/index.php/Shop/Index/index

http://zouke1220.oicp.net/wechat/tp3/index.php/Shop/Index/detail

② 后台模板引入(注意修改bootstrap的引入路径)

a.添加

² 引入产品添加页面

² 后台控制器添加方法

    //显示添加商品页面
public function add(){
$this->display();
}

² 访问控制器中的方法,查看显示效果

http://zouke1220.oicp.net/wechat/tp3/index.php/Shop/Admin/add

² 添加商品+图片上传

注意:配置好数据库连接D:\phpStudy\WWW\wechat\tp3\Application\Shop\Conf\config.php

    //添加商品+图片上传
public function addgoods(){
//var_dump($_POST);exit;
header("Content-type:text/html;charset=utf-8");
$m=M('goods');
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = ; // 设置附件上传大小
$upload->exts =array('jpg', 'gif', 'png', 'jpeg'); // 设置附件上传类型
$upload->rootPath ='./Public/Uploads/'; // 设置附件上传目录
$info = $upload->upload(); // 上传文件
if(!$info) {// 上传错误提示错误信息
echo '<script type="text/javascript">alert("上传图片失败");</script>';
exit;
}else{ // 上传成功
$_POST['img']=$info['img']['savepath'].$info['img']['savename'];
//var_dump($_POST);
/*
array(4) {
["name"]=> string(3) "222"
["price"]=> string(3) "222"
["pex"]=> string(4) "A类"
["img"]=> string(28) "2017-08-17/59952ffbea896.png"
}
*/
$arr=$m->add($_POST);
if($arr){
echo '<script type="text/javascript">alert("添加成功");</script>';
}else{
echo '<script type="text/javascript">alert("添加失败");</script>';
}
}


b.列表

² 引入展品列表显示页面

² 后台控制器列表方法

    //商品列表页
public function lists(){
$m=M('goods');
$data=$m->select();
$this->assign("data",$data);
$this->display();
}

² 访问控制器中的方法,查看显示效果

http://zouke1220.oicp.net/wechat/tp3/index.php/Shop/Admin/lists

c.删除

² 后台控制器列表方法

    //删除商品
public function del(){
header("Content-type:text/html;charset=utf-8");
$id=$_GET['id'];
$m=M('goods');
$res=$m->delete($id);
if($res){
echo '<script>alert("删除成功");history.go(-1);</script>';
}else{
echo '<script>alert("删除失败");history.go(-1);</script>';
}
}

² 点击删除按钮

③ 前台数据展示

a.控制器取数据

    //首页
public function index(){
    $m=M('goods');
    $data=$m->select();
    $this->assign('data',$data);
$this->display();
} //详情页
public function detail(){
     $m=M('goods');
$data=$m->find($_GET['id']);
$this->assign('data',$data);
$this->display();
  }
  //订单页
  public function order(){
   $this->assign('data',$_POST);
   $this->display();
  }

b.页面展示

D:\phpStudy\WWW\wechat\tp3\Application\Shop\View\Index\index.html

http://zouke1220.oicp.net/wechat/tp3/index.php/Shop/Index/index

D:\phpStudy\WWW\wechat\tp3\Application\Shop\View\Index\detail.html

http://zouke1220.oicp.net/wechat/tp3/Shop/Index/detail/id/2.html

D:\phpStudy\WWW\wechat\tp3\Application\Shop\View\Index\order.html

http://zouke1220.oicp.net/wechat/tp3/Shop/Index/order.html

将wechat\选择城市插件文件下的js文件拷贝到D:\phpStudy\WWW\wechat\tp3\Public\js下

将wechat\选择城市插件文件下的css文件拷贝到D:\phpStudy\WWW\wechat\tp3\Public\css下

订单页面order.html引入刚才的css文件:area.css和js文件:area.js、jquery-3.2.1.js

访问查看效果

c.写入订单到数据库

    //写入订单到数据库
public function addOrder(){
header('Content-type:text/html;charset=utf-8'); $data['gid']=$_POST['id'];
$data['name']=$_POST['name'];
$data['price']=$_POST['price']*$_POST['num'];
$data['num']=$_POST['num'];
$data['email']=$_POST['email'];
$data['mobile']=$_POST['mobile'];
$data['city']=$_POST['city'];
$data['detail']=$_POST['detail']; $m=M('orders');
$res=$m->add($data);
if($res){
echo '<script>alert("生成订单成功");history.go(-2)</script>';
}else{
echo '<script>alert("生成订单失败");history.go(-1)</script>';
}
}

④ 微信支付

同步:同步执行或跳转

异步:不管用户是否点击完成或跳转,微信服务器都会向我们的服务器推送数据

如果指定推送数据的地址:如果微信服务器没有收到返回参数,会一直向你的服务器推送数据,8次。

a.修改写订单方法

    //写入订单到数据库
public function addOrder(){
header('Content-type:text/html;charset=utf-8');
//未支付成功 缓存订单数据
if(empty($_GET['isnull'])){
//去支付
header('Location:http://zouke1220.oicp.net/wechat/tp3/WxPay/example/jsapi.php');
//缓存订单数据
$data['gid']=$_POST['id'];
$data['name']=$_POST['name'];
$data['username']=$_POST['username'];
$data['pirce']=$_POST['pirce']*$_POST['num'];
$data['num']=$_POST['num'];
$data['email']=$_POST['email'];
$data['mobile']=$_POST['mobile'];
$data['city']=$_POST['city'];
$data['detail']=$_POST['detail']; session('data',$data);
}else{ //支付成功 插入订单数据
$m=M('order');
$res=$m->add(session('data'));
if($res){
echo '<script>alert("生成订单成功");
location.href="http://zouke1220.oicp.net/wechat/tp3/Shop/Index";</script>';
}else{
echo '<script>alert("生成订单失败");history.go(-2)</script>';
}
}
}

b.修改jsapi.php

D:\phpStudy\WWW\wechat\tp3\WxPay\example\jsapi.php

<?php
/******************新增开始**********************/
session_start();
header('Content-type:text/html;charset=utf-8');
/******************新增结束**********************/ ini_set('date.timezone','Asia/Shanghai');
//error_reporting(E_ERROR);
require_once "../lib/WxPay.Api.php";
require_once "WxPay.JsApiPay.php";
require_once 'log.php';
//初始化日志
$logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');
$log = Log::Init($logHandler, ); //打印输出数组信息
/***********注释开始********************
function printf_info($data)
{
foreach($data as $key=>$value){
echo "<font color='#00ff55;'>$key</font> : $value <br/>";
}
}
************注释结束*******************/ //①、获取用户openid
$tools = new JsApiPay();
$openId = $tools->GetOpenid();
//②、统一下单
$input = new WxPayUnifiedOrder();
$input->SetBody($_SESSION['data']['name']); //动态获取
$input->SetAttach($_SESSION['data']['name']); //动态获取
$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
$input->SetTotal_fee($_SESSION['data']['price']); //动态获取
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + ));
$input->SetGoods_tag("test");
$input->SetNotify_url("http://zouke1220.oicp.net/wechat/tp3/WxPay/example/notify.php"); //异步回调
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openId);
$order = WxPayApi::unifiedOrder($input); /**************注释开始*********************
echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
printf_info($order);
***************注释结束********************/ $jsApiParameters = $tools->GetJsApiParameters($order);
//获取共享收货地址js函数参数
$editAddress = $tools->GetEditAddressParameters(); //③、在支持成功回调通知中处理成功之后的事宜,见 notify.php
/**
* 注意:
* 1、当你的回调地址不可访问的时候,回调通知会失败,可以通过查询订单来确认支付是否成功
* 2、jsapi支付时需要填入用户openid,WxPay.JsApiPay.php中有获取openid流程 (文档可以参考微信公众平台“网页授权接口”,
* 参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)
*/
?> <html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>微信支付样例-支付</title>
<script type="text/javascript">
//调用微信JS api 支付
function jsApiCall(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
<?php echo $jsApiParameters; ?>,
function(res){
/**************注释开始****************
WeixinJSBridge.log(res.err_msg);
alert(res.err_code+res.err_desc+res.err_msg);
***************注释结束***************/ /**************新增开始***********************/
if(res.err.msg == "get_brand_wcpay_request:ok"){
alert('支付成功');
location.href="http://zouke1220.oicp.net/wechat/tp3/Shop/Index/addOrder/isnull/1";
}else{
alert('支付失败');
location.href="http://zouke1220.oicp.net/wechat/tp3/Shop/Index/detail/id/<?php echo $_SESSION['data']['gid'];?>";
}
/***************新增结束***********************/
}
);
} function callpay(){
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}else{
jsApiCall();
}
}
</script>
<script type="text/javascript">
//获取共享地址
/**************注释开始*************************
function editAddress()
{
WeixinJSBridge.invoke(
'editAddress',
<?php echo $editAddress; ?>,
function(res){
var value1 = res.proviceFirstStageName;
var value2 = res.addressCitySecondStageName;
var value3 = res.addressCountiesThirdStageName;
var value4 = res.addressDetailInfo;
var tel = res.telNumber;
alert(value1 + value2 + value3 + value4 + ":" + tel);
}
);
}
window.onload = function(){
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', editAddress, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', editAddress);
document.attachEvent('onWeixinJSBridgeReady', editAddress);
}
}else{
editAddress();
}
};
*****************注释结束************************/
</script>
</head>
<body>
<!----------------------------注释开始----------------------------------------
<br/>
<font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px">1分</span>钱</b></font><br/><br/>
<div align="center">
<button style="width:210px; height:50px; border-radius: 15px; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >立即支付</button>
</div>
------------------------------注释结束--------------------------------------->
</body>
</html>

说明:

微信支付测试号暂时还测试不了,有兴趣可以参考

http://download.csdn.net/download/gcfranklin/8362257

http://www.cnblogs.com/txw1958/p/wxpayv3-jsapi.html

http://blog.csdn.net/u014033756/article/details/52038114

http://www.cnblogs.com/txw1958/p/wxpayv3-signkey.html

另外:选择order.html表单中的收获地址城市插件调用不了,有时间可以再调

下篇: php 微商城 基于Thinkphp3.2框架开发的更多相关文章

  1. php 微信公众号+微商城开发 基于Thinkphp3.2框架开发

    说明:本教程是自己自学+自己的理解+扩展(包括学习过程中遇到的一些问题) 参考教程:麦子学院--李忠益--http://www.maiziedu.com/u/70409/ 微盟: http://www ...

  2. 上篇: php 微信公众号 基于Thinkphp3.2框架开发

    说明:本教程是自己自学+自己的理解+扩展(包括学习过程中遇到的一些问题) 参考教程:麦子学院--李忠益--http://www.maiziedu.com/u/70409/ 微盟: http://www ...

  3. 基于thinkphp3.2.3开发的CMS内容管理系统 - ThinkPHP框架

    基于thinkphp3.2.3开发的CMS内容管理系统 thinkphp版本:3.2.3 功能: --分类栏目管理 --文章管理 --用户管理 --友情链接管理 --系统设置 目前占时这些功能,更多功 ...

  4. 基于Typecho CMS框架开发大中型应用

    基于Typecho CMS框架开发大中型应用 大中型应用暂且定义为:大于等于3个数据表的应用!汗吧! Typecho原本是一款博客系统,其框架体系有别于市面上一般意义MVC框架,主体代码以自创的Wid ...

  5. 基于thinkphp3.2.3开发的CMS内容管理系统(二)- Rbac用户权限

    基于thinkphp3.2.3开发的CMS内容管理系统 thinkphp版本:3.2.3 功能: --分类栏目管理 --文章管理 --商品管理 --用户管理 --角色管理 --权限管理 --友情链接管 ...

  6. 基于java spring框架开发部标1078视频监控平台精华文章索引

    部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面 ...

  7. 基于mpvue的框架开发微信小程序(搭建环境)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_103 美团很早就开源了mpvue这个项目,如此看来,美团可不仅仅是一家团购网站,真正的技术驱动型企业,使得我们多了一种用来开发微信 ...

  8. 基于AngularJS/Ionic框架开发的性能优化

    AngularJS作为强大的前端MVVM框架,虽然已经做了很多的性能优化,但是我们开发过程中的不当使用还是会对性能产生巨大影响. 下面提出几点优化的方法: 1. 使用单次绑定符号{{::value}} ...

  9. 基于Spring Boot框架开发的一个Mock

    背景:在项目后端接口开发还未完成,我们无法进行自动化接口用例的调试,希望与开发同步完成接口自动化用例的编写及调试,待项目转测后,可以直接跑自动化用例,提高测试效率. 选用的maven + Spring ...

随机推荐

  1. ByteArrayInputStream&ByteArrayOutputStream源码分析

    #ByteArrayInputStream 源码 ``` public synchronized int read(byte b[], int off, int len) { if (b == nul ...

  2. jq获取浏览器的高度

    // console.log("2-"+$(window).height()); //浏览器当前窗口可视区域高度 // console.log("3-"+$(d ...

  3. Pyqt5学习系列

    最近在学习Pyqt5做界面,找到了一个非常棒的博主的学习系列 在此记录下来: http://blog.csdn.net/zhulove86/article/category/6381941

  4. unity android相互调用

    简介 有一些手机功能,Unity没有提供相应的接口,例如震动,例如不锁屏,例如GPS,例如... 有太多的特殊功能Unity都没有提供接口,这时候,我们就需要通过使用Android原生的ADT编辑器去 ...

  5. 记录项目版本升级angular4 ~ angular5

    前言: 在上一篇ng4文章<angular4--实际项目搭建总结>中说过,等到ng5正式发布,并且蚂蚁的NG ZORRO兼容ng5之后,我会对ng4项目进行升级.这篇文章就是大概说下升级的 ...

  6. LogCook 一个简单实用的Android日志管理工具

    众所周知,日志的管理是软件系统很重要的一部分,千万不可忽略其重要性.完整的日志将会在系统维护中起着异常重要的作用,就好像磨刀不误砍柴工一样,日志就像对系统进行分析的工具,工具便捷了,对系统分析起来就能 ...

  7. Serializable 都这么牛逼了,Parcelable 还要你何用?

    一些闲聊 距离上一篇文章似乎又是很久了,看起来也没有很多反馈,催更就更不用说了.哈哈,放弃了. 话说最近公司在招聘一批至少 5 年开发经验的 Android 开发工程师,我也是忙开了花,激动得不行呀. ...

  8. caffe+opencv3.3dnn模块 完成手写数字图片识别

    最近由于项目需要用到caffe,学习了下caffe的用法,在使用过程中也是遇到了些问题,通过上网搜索和问老师的方法解决了,在此记录下过程,方便以后查看,也希望能为和我一样的新手们提供帮助. 顺带附上老 ...

  9. WCF、WebAPI、WCFREST、WebService之间的区别和选择

    转载翻译,原文:http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-a ...

  10. Java编程学习技巧和方法总结

    干货:必须要有反馈,不断调整,多读书,多些笔记. 解释:不练习你以为你能掌握?笑话,只有自己根据一个个小目标不断的敲,运行,给予你反馈,这样才会真的进步. 纸上谈Java,是永远停止在口.   关于笔 ...