ThinkPHP3.2.3集成微信支付版本php_sdk_v3.0.9

  1. 下载微信支付SDK(官方下载路径URL:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
  2. 将下载文件进行解压获取文件,文件结构如下图所示
  3. 找到ThinkPHP3.2.3第三方库中路径为:ThinkPHP\Library\Vendor。在此路径下创建文件夹Weixinpay(名称可以随意),将下载解压后的文件复制新建文件夹中。
  4. 在模块中创建控制器 WeixinpayController.class.php 用于处理支付,定义方法wxpay()实现支付功能。
  5. public function wxpay()
        {
            vendor('WeixinPay.example.WxPay#JsApiPay');//引入文件
            try{
    
    	        $tools = new JsApiPay();
    	        $openId = $tools->GetOpenid();
    
    	        //②、统一下单
    	        $input = new WxPayUnifiedOrder();
    	        $input->SetBody("test");        //商品描述
    	        //$input->SetAttach("test");    //附加数据暂未使用到可以注释掉	
    	        $input->SetOut_trade_no("sdkphp".date("YmdHis"));//商户订单号,此处订单号根据实际项目中订单号进行赋值,要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一
    	        $input->SetTotal_fee("1");      //订单总金额,单位为分
    	        $input->SetTime_start(date("YmdHis"));//订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010
    	        $input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。订单失效时间是针对订单号而言的,由于在请求支付的时候有一个必传参数prepay_id只有两小时的有效期,所以在重入时间超过2小时的时候需要重新请求下单接口获取新的prepay_id
    	        //$input->SetGoods_tag("test");//订单优惠标记,使用代金券或立减优惠功能时需要的参数,项目暂未使用到,因此注释掉
    	        $input->SetNotify_url("http://paysdk.weixin.qq.com/notify.php");//异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
    	        $input->SetTrade_type("JSAPI");//交易类型JSAPI 公众号支付;NATIVE 扫码支付;APP APP支付;
    	        $input->SetOpenid($openId);
    	        $config = new WxPayConfig();
    	        $order = WxPayApi::unifiedOrder($config, $input);
    	        echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
    	        $this->printf_info($order);
    	        $jsApiParameters = $tools->GetJsApiParameters($order);
    
    	        //获取共享收货地址js函数参数
    	        $editAddress = $tools->GetEditAddressParameters();
                //将数据渲染到模板中或前端页面中
                    $assign=array(
                        'data'=>$jsApiParameters
                    );
                    $this->assign($assign);
                    $this->display();
            } catch(Exception $e) {
    	        Log::ERROR(json_encode($e));//此处因为没有使用微信日志方法,所以暂未引入日志类
            }
       }
  6. 使用微信数据输出样式进行展示得到的数据:如下
  7. public function printf_info($data)
        {
            foreach($data as $key=>$value){
                echo "<font color='#00ff55;'>$key</font> :  ".htmlspecialchars($value, ENT_QUOTES)." <br/>";
            }
        }

     

  8.  此时访问wxpay()方法时会出现一堆报错,报错内容大概是一些xxx类不存在或者xxx方法不存在等信息,因为直接使用Vendor引入下载的SDK文件,入口文件是index.php,因此‘..’路径不对,所以需要修改SDK文件引入路径。如下:

  9. example/WxPay.JsApiPay.php文件修改如下:

         

         example/WxPay.Config.php文件修改如下:

        

  • 只需将类似这样的路径进行修改如上所示即可
  1. 配置微信支付所需要的参数,在example/WxPay.Config.php进行配置信息,配置数据获取方式网上搜索一堆,此处不再介绍

  

  • html页面渲染如下:此页面是官方提供的代码样式,此处代码写在和控制器WeixinpayController.class.php一个模块中。使用的是ThinkPHP本身前后端编写方式。
<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()
	{
		var data={$data};
		WeixinJSBridge.invoke(
			'getBrandWCPayRequest', data, 
			function(res){
				WeixinJSBridge.log(res.err_msg);
				alert(res.err_code+res.err_desc+res.err_msg);
			}
		);
	}


	
	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;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer;  color:white;  font-size:16px;" type="button" onclick="callpay();" >立即支付</button>
	</div>
</body>
</html>
  • 此时可以进行测试支付操作,可以进行正常唤起支付弹窗进行支付。
  1. 支付成功之后进行回调处理
  2. 在控制器WeixinpayController.class.php中定义notify()方法用于调用回调:如下
  3. 在example/notify.php文件中进行处理回调逻辑代码:如下
  4. 微信支付到此结束
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值