当前位置:今日智造 > 智造快讯 > 热门直播 > MES

php开发支付那些小事儿--微信支付

2017/5/28 2:09:14 人评论 次浏览 来源:PHP开源社区 分类:MES

php自学与交流QQ群339251396

六星PHP学院教学视频

想要领取六星PHP学院“整套学习视频基础教程”(所谓整套就是从前端到后端的基础视频教程,比较适合新手)的同学,可以加QQ990824742,领取视频教程,加入时验证信息填:PHP开源社区

欢迎关注:六星PHP开源社区

六星PHP开源社区”,有学习文档,框架视频教程,网站教程,提供百度分享给大家下载,收藏。大家关注后回复关键词,便可获取!平台将与大家分享前端到后端的实例,学习语法,学习教程,技巧等!欢迎大家关注!

文章正文内容

关于微信商户申请支付这些内容,这里不再赘述,不清楚的小伙伴们请自行搜索流程步骤。

项目前提:本人用的是tp框架,PHP语言

下载到微信平台提供的微信支付接口文件,放在了tp第三方类库vendor,命名为WxpayAPI,

Paste_Image.png

WxpayAPI/lib/WxPay.Api.php 接口访问类;WxpayAPI/lib/WxPay.Config.php 配置账号信息;WxpayAPI/lib/WxPay.Data.php 数据对象基础类;WxpayAPI/lib/WxPay.Exception.php 微信支付API异常类;WxpayAPI/lib/WxPay.Notify.php 回调基础类WxpayAPI/example/WxPay.JsApiPay.php JSAPI支付实现类

Paste_Image.png

1.对源码进行了部分修改

(1)WxPay.Api.php 里注释掉//require_once "WxPay.Exception.php";//require_once "WxPay.Config.php";//require_once "WxPay.Data.php";(2)WxPay.Config.php里需要根据商户信息对APPID , MCHID ,KEY , APPSECRET 进行配置。(3)WxPay.Data.php 里注释掉//require_once "WxPay.Config.php";//require_once "WxPay.Exception.php";(4)WxPay.JsApiPay.php 里注释掉//require_once "../lib/WxPay.Api.php";

配置好这些,接下来就是我们的重点部分了。

2.在订单控制器GoodsController.class.php有订单函数sure()和回调信息函数 Callback_url()

/*** 提交订单函数*/public function sure() {$o_model = D("Wine/Orders");if (IS_AJAX) {$data = I("post.");if ($o_model->create($data)) {if (!sp_check_verify_code()) {$this->error("验证码错误!");}#生成随机订单号$order_code = O . date(YmdHis) . $o_model->get_order_code(4);while ($o_model->findone(array("order_code" => $order_code))) {$order_code = O . date(YmdHis) . $o_model->get_order_code(4);}$data[order_code] = $order_code;$addr[0] = $_POST[prov];$addr[1] = $_POST[city];$addr[2] = $_POST[dist];$addr[3] = $_POST[area];$data[area] = serialize($addr);$data[create_time] = time();$data[update_time] = time();if ($data[pay_id] == 1) {$data[order_status] = 11; //已付款$data[status] = 1;} else {$data[order_status] = 10; //待付款$data[status] = 1;}//函数调用 返回信息$this->Callback_url($data);} else {$this->error($o_model->getError());}} else {$this->error($o_model->getError());}}/*** 回调信息函数* @param type $data*/public function Callback_url($data) {$o_model = D("Wine/Orders");$add_id = $o_model->add($data);if (!$add_id) {$this->error("订单提交失败,请稍后重试!");}if (4 == $data[pay_id]) {if (4 == $data[pay_id]) {//微信支付$msg = 正在为您跳转到微信支付页面,请等待……;$url = "/index.php/wine/wxpay/index/?o_id=$add_id";}$this->success("订单提交成功!" . $msg, $url);}

3.[咳咳,这个是重点哈!!!] WxpayController .class.php微信支付控制器,实现对微信接口的调用

<?php/*** 微信支付接口调用*/namespace Wine\Controller;use Common\Controller\HomebaseController;class WxpayController extends HomebaseController {public function _initialize() {parent::_initialize();Vendor("WxpayAPI/example/log");//订单数据写入日志//注: 引入第三方类库中的微信接口文件,对于文件名含有.的,皆用#代替连接才能引入,后缀名不写。Vendor("WxpayAPI/example/WxPay#JsApiPay");Vendor("WxpayAPI/lib/WxPay#Config");Vendor("WxpayAPI/lib/WxPay#Data");Vendor("WxpayAPI/lib/WxPay#Exception");Vendor("WxpayAPI/lib/WxPay#Notify");Vendor("WxpayAPI/lib/WxPay#Api");//初始化日志$logHandler = new \CLogFileHandler("/projects/wine.huishuocs.com/data/pay_log/" . date(Y-m-d) . .log);$log = \Log::Init($logHandler, 15);$this->model = D("Wine/Orders");$this->url = MODULE_NAME . / . CONTROLLER_NAME . /index;}/*** 显示支付页面**/public function index() {// 判断当前订单是否被支付$orderid = I("get.o_id", 0, "intval");$orderid || $this->error("非法操作!");$this->assign(orderid,$orderid);$info = $this->model->findone(array("a.id" => $orderid, a.status => array(neq, -1)));$info || $this->error("暂未查询到该订单!");//10代表订单待支付的状态if ($info[order_status] != 10) {$this->error("订单已支付!");}//①、获取用户openid$tools = new \JsApiPay();$openId = $tools->GetOpenid(); #无法使用//初始化日志\Log::INFO(订单 . var_export($info, true));$out_trade_no = \WxPayConfig::MCHID . date("YmdHis");$this->model->where(array("id" => $orderid))->save(array(out_trade_no => $out_trade_no));//$openId ="123"; #无法使用//②、统一下单$input = new \WxPayUnifiedOrder();$input->SetBody($info[mode_name]);$input->SetAttach($orderid);$input->SetOut_trade_no($out_trade_no);//$input->SetTotal_fee($orderArr[total_price]*100);实际支付价格$input->SetTotal_fee($info[pay_price]*100); //测试时请将支付价格改为0.01,土豪请避开此注释$this->assign(pay_price,$info[pay_price]);$input->SetTime_start(date("YmdHis"));$input->SetTime_expire(date("YmdHis", time() + 600));//$input->SetGoods_tag("test");# 优惠券$input->SetNotify_url(http:// . $_SERVER[HTTP_HOST] . "/index.php/Wine/Wxpay/callback"); //回调地址$input->SetTrade_type("JSAPI");$input->SetOpenid($openId);$order = \WxPayApi::unifiedOrder($input);//echo <font color="#f00"><b>统一下单支付单信息</b></font><br/>;//$this->printf_info($order);//打印参数$this->assign(o_id,$orderid);$this->assign(jsApiParameters, $tools->GetJsApiParameters($order));//获取共享收货地址js函数参数//$this->assign(editAddress, $tools->GetEditAddressParameters());$this->display(wxpay);exit;}/*** 打印输出数组信息* @param type $data*/public function printf_info($data) {foreach ($data as $key => $value) {echo "<font color=#00ff55;>$key</font> : $value <br/>";}}/* 支付成功回调函数 */public function callback() {/* 返回给微信服务器 *///$mes = array(//return_code => SUCCESS,//return_msg => OK//);//$this->ajaxReturn($mes, XML);$logHandler = new \CLogFileHandler("/projects/wine.huishuocs.com/data/pay_log/" . date(Y-m-d) . .log);$log = \Log::Init($logHandler, 15);//$streamData = isset($GLOBALS[HTTP_RAW_POST_DATA]) ? $GLOBALS[HTTP_RAW_POST_DATA] : ;$streamData = file_get_contents(php://input);if ($streamData != ) {$arr = $this->xmlToArray($streamData);\Log::INFO(支付 . var_export($arr, true));} else {$ret = false;}// 回调值if (!empty($arr)) {# 数据\Log::INFO(数据1 . var_export($arr, true));#修改订单状态$out_trade_no = $arr[out_trade_no];$newArr = array(order_status => 11,status=>1);$this->model->where(array("out_trade_no" => $out_trade_no))->save($newArr);$info = $this->model->findone(array("a.out_trade_no" => $out_trade_no, a.status => array(neq, -1)));$sql = $this->model->getLastSql();\Log::INFO(数据2 . $sql);#添加支付记录pay$pay = array(payment_code => wxpay,trade_no=>$info[order_code],out_trade_no=>$out_trade_no,order_id=>$info[id],create_time=>time());M(payment_record)->add($pay);}/* 返回给微信服务器 */$mes = array(return_code => SUCCESS,return_msg => OK);$this->ajaxReturn($mes, XML);}//将XML转为arraypublic function xmlToArray($xml) {//禁止引用外部xml实体libxml_disable_entity_loader(true);$values = json_decode(json_encode(simplexml_load_string($xml, SimpleXMLElement, LIBXML_NOCDATA)), true);return $values;}}?>

4.前端微信支付页面wxpay.html

<html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link href="__TMPL__Public/css/weui.css" type="text/css" rel="stylesheet"/><title>微信订单支付</title><script type="text/javascript">//调用微信JS api 支付function jsApiCall(){WeixinJSBridge.invoke(getBrandWCPayRequest,<php> echo $jsApiParameters; </php>,function(res) {WeixinJSBridge.log(res.err_msg);if (res.err_msg == "get_brand_wcpay_request:ok") {//alert(res.err_code + res.err_desc + res.err_msg);// 成功跳转页面window.location.href = {:U("Orders/pay_ok",array("o_id"=>$o_id))};} else {// 统一跳转}});}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></head><body><br/><div class="container" id="container"><div class="msg"><div class="weui_msg"><div class="weui_icon_area"><i class="weui_icon_success weui_icon_msg"></i></div><div class="weui_text_area"><h2 class="weui_msg_title">订单已生成</h2><p class="weui_msg_desc">该笔订单支付金额为:<php> echo $pay_price;</php></p></div><div class="weui_opr_area"><p class="weui_btn_area"><a href="javascript:;" class="weui_btn weui_btn_primary" onclick="callpay()">立即支付</a><!--<a href="{:U(Order/pay_ok,array(o_id=>$_GET[o_id]))}" class="weui_btn weui_btn_default">取消支付</a>--></p></div><!--<div class="weui_extra_area"><a href="/wap/order/order_det/<?php echo $order[id]?>.html">查看详情</a></div>--></div></div></div></body></html>

5.支付成功跳转到OrderController.class.php ,订单支付完成

/** * 支付页面 */public function pay_ok() {$o_id = I("get.o_id", 0, "intval");$info = $this->model->findone(array("a.id" => $o_id, a.status => array(neq, -1)));if (empty($info)) {# 获取最新可用的商品编号$goods = D(Goods)->where(array(status => 1))->order(id desc)->find();$this->error("该订单不存在,请重新正确进入", U(Goods/sale, array(id => $goods[id])));}$this->assign(imgurl, "/wine/img/ok.png");$this->assign(tips, "订购成功");if (4 == $info[pay_id]) {//微信支付成功$this->assign($info);$this->display();} else {$this->assign($info);$this->assign(tips, "订购失败");$this->assign(imgurl, "/wine/img/nook.png");$this->display();}}

(点击左下角阅读全文,解锁更多姿势)

点击上面微信号关注我关注我哟

PHP开源社区会定期推送PHP实例,PHP语法,MySQL教程,Linux教程,学习方法,视频教程,项目案例等诸多优质内容,致力于打造PHP开源社区!关注我们妥妥没错!(技术解答QQ:10202706

免责声明:本文系网络转载,版权归原作者所有,如涉及版权,请联系我们删除,QQ:1138247081!

共有条评论 网友评论

验证码: 看不清楚?