首页 > 代码库 > 在douphp中加入微信支付教程

在douphp中加入微信支付教程

本教程结合推送模板消息效果更佳!
如果您在用douphp的订单会员模块并且在微信端使用,那么在处理订单的时候可以使用微信付款!
前提条件:
开通微信支付
微信公众号
会员关注了你的微信公众号

直接使用微信提供的sdk就可以,具体的操作办法如下!

1.下载微信提供的公众号内支付的sdk文件!
下载地址:https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip
2.解压后我们放在m/目录下即可(按照sdk/doc文件夹内的word文档修改配置信息)
3.假设我需要在order.php?rec=success (订单插入数据库成功的页面)增加微信支付按钮,并且发起支付 代码如下:

  1.   //调用微信支付
  2.                 require_once "wx_pay/lib/WxPay.Api.php";
  3.                 require_once "wx_pay/example/WxPay.JsApiPay.php";
  4.                 require_once ‘wx_pay/example/log.php‘;        
  5.                 //初始化日志
  6.                 $logHandler= new CLogFileHandler("wx_pay/logs/".date(‘Y-m-d‘).‘.log‘);
  7.                 $log = Log::Init($logHandler, 15);        
  8.                 
  9.                 $fee =  $order[‘order_amount‘] * 100;
  10.                 
  11.                 //①、获取用户openid
  12.                 $tools = new JsApiPay();
  13.                 $openId = $tools->GetOpenid();        
  14.                 //echo $openId;
  15.                 //②、统一下单
  16.                 $input = new WxPayUnifiedOrder();
  17.                 $input->SetBody(‘订单编号:‘.$order[‘order_sn‘]);
  18.                 $input->SetAttach(‘订单编号:‘.$order[‘order_sn‘]);
  19.                 $input->SetOut_trade_no($order[‘order_sn‘]);
  20.                 $input->SetTotal_fee($fee);
  21.                 $input->SetTime_start(date("YmdHis"));
  22.                 $input->SetTime_expire(date("YmdHis", time() + 600));
  23.                 $input->SetGoods_tag("test");
  24.                 $input->SetNotify_url(‘yyhj.hbwelife.com/m/wx_pay_notify.php‘);
  25.                 $input->SetTrade_type("JSAPI");
  26.                 $input->SetOpenid($openId);
  27.                 $wx_order = WxPayApi::unifiedOrder($input);
  28.                 //echo ‘<font color="#f00"><b>统一下单支付单信息</b></font><br/>‘;
  29.                 //printf_info($wx_order);
  30.                 $jsApiParameters = $tools->GetJsApiParameters($wx_order);
  31.                 $smarty->assign("jsApiParameters", $jsApiParameters);        
  32.                
复制代码

那么我们在order.dwt 中需要增加下面的代码:

  1.     <script type="text/javascript">
  2.         {literal}
  3.         //前台调用微信JS api 支付
  4.         function jsApiCall()
  5.         {
  6.         
  7.             WeixinJSBridge.invoke(
  8.                 ‘getBrandWCPayRequest‘,{/literal}
  9.                                 {$jsApiParameters},
  10.                                 {literal}
  11.                 function(res){
  12.                     WeixinJSBridge.log(res.err_msg);
  13.                     //alert(res.err_code+res.err_desc+res.err_msg);
  14.                     if(res.err_msg == "get_brand_wcpay_request:ok"){
  15.                                                 //支付成功跳转到订单列表或者跳转到某个单页
  16.                                                  window.location.href="http://xxxxxx.com/m/user.php?rec=order_list";
  17.                                         }
  18.                     
  19.                 }
  20.             );
  21.         }
  22.         function callpay()
  23.         {
  24.             
  25.          if (typeof WeixinJSBridge == "undefined"){
  26.                 if( document.addEventListener ){
  27.                     document.addEventListener(‘WeixinJSBridgeReady‘, jsApiCall, false);
  28.                 }else if (document.attachEvent){
  29.                     document.attachEvent(‘WeixinJSBridgeReady‘, jsApiCall); 
  30.                     document.attachEvent(‘onWeixinJSBridgeReady‘, jsApiCall);
  31.                 }
  32.             }else{
  33.                 jsApiCall();
  34.             }
  35.             
  36.         }
  37.                 {/literal}
  38.         </script>
复制代码

在页面中付款就可以调用 callpay()来直接支付!看演示图


支付成功之后的回调页面代码如下,我们需要更新订单状态:
php code:

  1. <?php
  2. define(‘IN_DOUCO‘, true);
  3. require (dirname(__FILE__) . ‘/include/init.php‘);
  4. require_once "wx_pay/lib/WxPay.Api.php";
  5. require_once "wx_pay/lib/WxPay.Notify.php";
  6. require_once ‘wx_pay/example/log.php‘;
  7. //初始化日志
  8. $logHandler= new CLogFileHandler("wx_pay/logs/".date(‘Y-m-d‘).‘.log‘);
  9. $log = Log::Init($logHandler, 15);
  10. class PayNotifyCallBack extends WxPayNotify
  11. {
  12.         //查询订单
  13.         public function Queryorder($transaction_id)
  14.         {
  15.                 $input = new WxPayOrderQuery();
  16.                 $input->SetTransaction_id($transaction_id);
  17.                 $result = WxPayApi::orderQuery($input);
  18.                 Log::DEBUG("query:" . json_encode($result));
  19.                 if(array_key_exists("return_code", $result)
  20.                         && array_key_exists("result_code", $result)
  21.                         && $result["return_code"] == "SUCCESS"
  22.                         && $result["result_code"] == "SUCCESS")
  23.                 {
  24.                         return true;
  25.                 }
  26.                 return false;
  27.         }
  28.         
  29.         //重写回调处理函数
  30.         public function NotifyProcess($data, &$msg)
  31.         {
  32.                 Log::DEBUG("call back:" . json_encode($data));
  33.                 $notfiyOutput = array();
  34.                 
  35.                 if(!array_key_exists("transaction_id", $data)){
  36.                         $msg = "输入参数不正确";
  37.                         return false;
  38.                 }
  39.                 //查询订单,判断订单真实性
  40.                 if(!$this->Queryorder($data["transaction_id"])){
  41.                         $msg = "订单查询失败";
  42.                         return false;
  43.                 }
  44.                 
  45.                 $order_sn = $data["out_trade_no"];
  46.                 //引入订单
  47.                 include_once (ROOT_PATH . ‘include/order.class.php‘);
  48.                 $dou_order = new Order();        
  49.                 $dou_order->change_status($order_sn, 1);
  50.                 return true;
  51.         }
  52. }
  53. Log::DEBUG("begin notify");
  54. $notify = new PayNotifyCallBack();
  55. $notify->Handle(false);
复制代码

这样微信支付就完成了!之后更新,扫码支付!可以用在PC端的

在douphp中加入微信支付教程