小白 关于TP3.2的微信支付[已完善]

浏览:5250 发布日期:2016/12/24 分类:用法示例
这不是我写的,同事已写好后,我只是仿照着写,也没好好的回过头来总结总结,今天刚好有时间,所以稍微整理总结一下(内容大概三部分,前端支付调用,支付金额,退款)。。。。
首先是下载这个微信提供的文件 wx ,里面的cwx还有wxpay文件夹解压放在根目录下就行, 文件名是改了的话,后引用文件也要跟着改咯(心惊胆战的说一句,cwx里面/lib/config文件的证书路径底部的【上报信息配置】的证书路径要改改,这里的是绝对路径。)
如图

上图的APPID,MCHID等,这些是在控制器里define写的

接下来是控制器部分【前端支付页面调用后面再写】<?php
namespace Home\Controller;
/**
 * 微信商城
 */
class TestController extends \Think\Controller {   
public function __construct() {    
       parent::__construct();
       define("APPID", 'wx28e4cb89');//微信公众号APPID
       define("MCHID","135456");//微信商户号
       define("KEY","j34893h89955e3jj");//微信商户自定义32为KEY
       define("APPSECRET",'a2051fc02dbc9');//微信公众号appsecret
       if (!session("OPENID")) {//判断是否有openid
           if (!isset($_GET['code'])) {
               $redirect_uri = "http://" . rtrim($_SERVER['HTTP_HOST'], '/') . __SELF__;//地址
               $redirect_uri = urlencode($redirect_uri);
               redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . APPID . "&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect");
               die();
           }
           if (isset($_GET['code'])) {           
               $code = $_GET['code'];
               $str = myget("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . APPID . "&secret=" . APPSECRET . "&code=$code&grant_type=authorization_code");  
               $arr = json_decode($str, TRUE);
               session('OPENID', $arr['openid']);//设置OPENID
           }
       }
   }

 /**
     * 获取支付参数
     */
    public function getrmsg() {
        ini_set('date.timezone', 'Asia/Shanghai');
//引用文件的地址改动后要注意
        require_once "./cwx/lib/WxPay.Api.php";
        require_once "./cwx/WxPay.JsApiPay.php";
        require_once './cwx/log.php';
//初始化日志
        $logHandler = new \CLogFileHandler("./wxpay/logs/" . date('Y-m-d') . '.log');
        $fee = (real) I("salary"); //这里是支付的总金额(元)  
        $ordersn = \WxPayConfig::MCHID . date("YmdHis").  rand(1000,9999);//交易号(保存到本地,后面退款要用的)
//①、获取用户openid
        $tools = new \JsApiPay();
//$openId = $tools->GetOpenid();//获取OPENID
        $openId =session("OPENID");//这个前面生成OPENID都一样,那这样这里可以优化,就是上面的获取OPENID可以省去,用上面的获取OPENID
//②、统一下单
        $input = new \WxPayUnifiedOrder();
        $input->SetBody("微信支付");
        $input->SetAttach("微信支付");
        $input->SetOut_trade_no($ordersn);//交易号
        $input->SetTotal_fee($fee * 100); //单位分
        $input->SetTime_start(date("YmdHis"));//起始交易时间
        $input->SetTime_expire(date("YmdHis", time() + 600));//过期时间
        $input->SetGoods_tag("微信支付");
        $input->SetNotify_url("http://".$_SERVER["HTTP_HOST"].U("Api/wxpaynotify"));//支付回调地址,这里改成你自己的回调地址。
        $input->SetTrade_type("JSAPI");//交易类型,JSAPI,NATIVE,APP
        $input->SetOpenid($openId);
        $order = \WxPayApi::unifiedOrder($input);
        $jsApiParameters = $tools->GetJsApiParameters($order);
        echo $jsApiParameters;
    }
下面是回调地址文件下要添加的内容【有过情况是文件开头有构造函数时导致微信回调信息被拦截】    /**
     *  微信通知地址(微信网页)
     */
    public function wxpaynotify() {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);//解析回调数据
        //file_put_contents("./test123456.txt",serialize($postStr));
        $out_trade_no = $postObj->out_trade_no; //交易单号
        $result = $postObj->result_code; //SUCCESS支付成功
        if ($result != "SUCCESS") {
            die("error");
        }
        //下面可以写处理的支付订单状态等一些内容了
        //$res = M("cdorder")->where("ordersn='{$out_trade_no}' and typeid=0")->save(array("typeid" => 1)); //将微信订单中的状态置1;
        if ($res) {
            echo 'SUCCESS';
        } else {
            echo 'error';
        }
    }
(等下展示前端接受到支付成功的代码部分,起始微信支付上都有写)微信支付的代码就这些了【感觉漏了写,石化~】
下面是微信支付退款的函数,写在了Application/Common/Common的function文件了这里我追到代码WX_PATH是什么鬼了
//微信支付路径
define('WX_PATH',SITE_PATH.'wxpay/demo/');
上面这行代码复制到项目入口文件上

function wxrefund($tradeno, $money) {
    require_once WX_PATH . "../lib/WxPay.Api.php";
    require_once WX_PATH . 'log.php';
    $logHandler = new \CLogFileHandler("../logs/" . date('Y-m-d') . '.log');
    $log = \Log::Init($logHandler, 15);
    $input = new \WxPayRefund();
    $input->SetOut_trade_no($tradeno);//这个的订单号是上面生成的那串交易号
    $input->SetTotal_fee((real) $money * 100);//单位是分
    $input->SetRefund_fee((real) $money * 100);//单位是分
    $input->SetOut_refund_no(\WxPayConfig::getvar("MCHID") . date("YmdHis"));
    $input->SetOp_user_id(\WxPayConfig::getvar("MCHID"));
    $res = \WxPayApi::refund($input);
    return $res;
}

设置好后,数据出传进去就可以直接调用了
 $response = wxrefund($tradeno, $money);
           //$response[result_code]=SUCCESS;//退款成功会返回SUCCESS
            if ($response[result_code] != "SUCCESS") {
                //这里可以写退款失败要执行的动作
            }
下面是前端支付部分,首先是支付时弹出支付页面还有键盘,这里封装在了JS文件里了,文件也更新放上来了,jquery-1.11.1.min.js,【文件名自己取都可以】//调用文件,注意自己放的路径
<script type="text/javascript" src="/Public/wx/js/jquery-1.11.1.min.js"></script>
//下面是在class类里直接加上 wcpay 就行
<div class="btn wcpay">确认买单</div>
//下面是<script>部分内容
//立即支付
$(".wcpay").bind("click",function(){
    if(flag==0){//防止重复点击支付
            return false;
    }
    flag=0;
    var iptfee=$("#iptfee").val();
    //用AJAX方式传参(上面控制器的路径,)
   $.post("/index.php/Home/Test/getrmsg",{
      "salary":$("#rfee").html(),iptfee:iptfee//其他需要传的的信息
   },function(rmsg){
    flag=1;//重新置1;
    //console.log(JSON.stringify(rmsg));return false;
    if (typeof WeixinJSBridge == "undefined"){//这里建议直接复制就行了
        if( document.addEventListener ){
                                                                                                                             document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
        }else if (document.attachEvent){
             document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
                                        document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
           }
    }else{
           onBridgeReady(rmsg);
        }
   },"json")
 });

/**
 * 发起微信支付JS函数
 */
  function onBridgeReady(rmsg){
        layer.load(1, {
         //这里使用了layer插件,有兴趣的也可以使用下
        //http://layer.layui.com/  网址在这,下载后放在Public下就行,【之前的分页也是使用的layer】
           shade: [0.8,'#fff'] //0.1透明度的白色背景
         });
         //alert(JSON.stringify(rmsg));//return false;
          WeixinJSBridge.invoke(
             'getBrandWCPayRequest',rmsg,
              function(res){ 
          layer.closeAll();
      if(res.err_msg.match("cancel")){//微信返回的支付结果,针对三种情况可以跳转相应页面。
            //layer.alert("您已取消支付");
           window.location.href="/index.php/Home/Test/new1";
       }
        if(res.err_msg.match("fail")){//支付失败
                                                      window.location.href="/index.php/Home/Test/new2";
        }
       if(res.err_msg.match("ok")) {
      // layer.alert('支付成功',{shade:0.8,icon:6});//前端只是展示,实际以通知URL为准
                                                                          window.location.href="/index.php/Home/Test/new3";
      }
     // if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。 
        }
      ); 
    }
至此,支付,退款,前端调用重要部分给分享出来了,感觉还挺多不完善的地方,还会继续完善精简,谢谢~

附件 wx.zip ( 617.71 KB 下载:440 次 )

评论( 相关
后面还有条评论,点击查看>>