Thinkphp 微信支付demo

  • 内容
  • 相关

下单代码:pay.php


<?php
namespace Wap\Controller;
use Common\Controller\WapbaseController;
Vendor('Wxpay.WxPayApi');
Vendor('Wxpay.JsApiPay');
Vendor('Wxpay.Notify');
class PayController extends WapbaseController {
	
	function _initialize(){
		parent::_initialize();
	}

	/**
	 * 立即购买
	 */
	public function pay(){
 		if(!empty($_GET)){
			$id = I('get.id');
			$data_info = M('data')->where('id='.$id)->find();
			//获取用户信息
			$info = M('users')->where("wx_openid='".$_SESSION['user']['wx_openid']."'")->find();
			if(empty($info['user_email'])){
				$this->success('请完善资料再进行购买',U('index/my'));
				die;
			}
			
			$tools = new \JsApiPay();
			$openId = $tools->GetOpenid();

			//②、统一下单
			$input = new \WxPayUnifiedOrder();
			$input->SetBody($data_info['name']);
			$input->SetAttach('goumai');
			$trade_no = \WxPayConfig::MCHID.date("YmdHis");
			$input->SetOut_trade_no($trade_no);
			$input->SetTotal_fee("1");
			$input->SetTime_start(date("YmdHis"));
			$input->SetTime_expire(date("YmdHis", time() + 600));
			$input->SetGoods_tag("test");
			$input->SetNotify_url("http://1.aigowu.cn/index.php/Wap/Notify/notify/");
			$input->SetTrade_type("JSAPI");
			$input->SetOpenid($openId);
			$order = \WxPayApi::unifiedOrder($input);
			if($order){
				$info = M('users')->where("wx_openid='".$_SESSION['user']['wx_openid']."'")->find();
				$data['uid'] = $info['id'];
				$data['trade_no'] = $trade_no;
				$data['data_id'] = $data_info['id'];
				$data['money'] = $data_info['price'];
				$data['addtime'] = time();
				M('order')->add($data);
				
			}
			
			$jsApiParameters = $tools->GetJsApiParameters($order);
			$this->assign('jsApiParameters',$jsApiParameters);
			$this->assign($data_info);
			$this->display();
 		}
		
	}
    
	/**
	 * 结算
	 */
	public function jiesuan(){
		if(!empty($_GET)){
			$id_string = I('get.id');
			$id_array = explode(',', $id_string);
			//获取用户信息
			$info = M('users')->where("wx_openid='".$_SESSION['user']['wx_openid']."'")->find();
			if(empty($info['user_email'])){
				$this->success('请完善资料再进行购买',U('index/my'));
				die;
			}
			foreach ($id_array as $key =>$val){
				$shapcar = M('shapcar')->where('id='.$val)->find();
				$dataa = M('data')->where('id='.$shapcar['data_id'])->find();
				$money += $dataa['price'];
			}
			
			$tools = new \JsApiPay();
			$openId = $tools->GetOpenid();

			//②、统一下单
			$input = new \WxPayUnifiedOrder();
			$input->SetBody('优点讯资源下载');
			$input->SetAttach('jiesuan');
			// 订单号
			$trade_no = \WxPayConfig::MCHID.date("YmdHis");
			$input->SetOut_trade_no($trade_no);
			$input->SetTotal_fee("1");
			$input->SetTime_start(date("YmdHis"));
			$input->SetTime_expire(date("YmdHis", time() + 600));
			$input->SetGoods_tag("test");
			$input->SetNotify_url("http://1.aigowu.cn/index.php/Wap/Notify/notify/");
			$input->SetTrade_type("JSAPI");
			$input->SetOpenid($openId);
			$order = \WxPayApi::unifiedOrder($input);
			if($order){
				$info = M('users')->where("wx_openid='".$_SESSION['user']['wx_openid']."'")->find();
				foreach ($id_array as $key =>$val){
					$dafa['trade_no'] = $trade_no;
					$res = M('shapcar')->where('id='.$val)->save($dafa);
					$shapcar = M('shapcar')->where('id='.$val)->find();
					$data_info = M('data')->where('id='.$shapcar['data_id'])->find();
					
					$data['uid'] = $info['id'];
					$data['trade_no'] = $trade_no;
					$data['data_id'] = $data_info['id'];
					$data['money'] = $data_info['price'];
					$data['addtime'] = time();
					
					M('order')->add($data);
				}

			}
			
			$datas['name'] = '购物车结算';
			$datas['price'] = $money.'.00';
			$jsApiParameters = $tools->GetJsApiParameters($order);
			$this->assign('jsApiParameters',$jsApiParameters);
			$this->assign($datas);
			$this->display('pay');
			
			
		}	
	}
	
	
	
	
	
}

回调代码:


<?php
namespace Wap\Controller;
use Think\Controller;
Vendor('Wxpay.WxPayApi');
Vendor('WxPayPubHelper.WxPayPubHelper');
class NotifyController extends Controller{
	
	private $reply;
	function _initialize(){
		
	}
	/*
	 *  支付回调接口
	 */
	public function notify()
		{
			//使用通用通知接口
			$notify = new \Notify_pub();
		
			//存储微信的回调
			$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
			$notify->saveData($xml);
		
			//验证签名,并回应微信。
			//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
			//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
			//尽可能提高通知的成功率,但微信不保证通知最终能成功。
			if($notify->checkSign() == FALSE){
				$notify->setReturnParameter("return_code","FAIL");//返回状态码
				$notify->setReturnParameter("return_msg","签名失败");//返回信息
			}else{
				$notify->setReturnParameter("return_code","SUCCESS");//设置返回码
			}
			$returnXml = $notify->returnXml();
			echo $returnXml;
		
			//==商户根据实际情况设置相应的处理流程,此处仅作举例=======
		
			//以log文件形式记录回调信息
			 //$log_ = new Log_();
			$log_name= "./log.log";//log文件路径
		
			$this->log_result($log_name,"【接收到的notify通知】:\n".$returnXml."\n");
		
			if($notify->checkSign() == TRUE)
			{
				if ($notify->data["return_code"] == "FAIL") {
					//此处应该更新一下订单状态,商户自行增删操作
				$this->log_result($log_name,"【通信出错】:\n".$xml."\n");
					echo "error";
				}
				elseif($notify->data["result_code"] == "FAIL"){
					//此处应该更新一下订单状态,商户自行增删操作
				$this->log_result($log_name,"【业务出错】:\n".$xml."\n");
					echo "error";
				}
				else{
					//此处应该更新一下订单状态,商户自行增删操作
					$this->log_result($log_name,"【支付成功】:\n".$xml."\n");
					
					$type = $notify->data["attach"]; //  = jiesuan   购物车结算  
					$order_sn = $notify->data["out_trade_no"]; //订单号 
					//处理业务逻辑
					
					echo "SUCCESS";
					
				}
			$returnXml = "<xml> 
							<return_code><![CDATA[SUCCESS]]></return_code>
							<return_msg><![CDATA[OK]]></return_msg>
						</xml>";
			echo $returnXml;
				//商户自行增加处理流程,
				//例如:更新订单状态
				//例如:数据库操作
			}	//例如:推送支付完成信息
			
		}
		
		function  log_result($file,$word)
		{
			$fp = fopen($file,"a");
			flock($fp, LOCK_EX) ;
			fwrite($fp,"执行日期:".strftime("%Y-%m-%d-%H:%M:%S",time())."\n".$word."\n\n");
			flock($fp, LOCK_UN);
			fclose($fp);
		}

}

?>
前端代码:(js吊起支付)


<!DOCTYPE html>
<html>
	<head>
	<tc_include file="Wap:head" />
	<link rel="stylesheet" type="text/css" href="__TMPL__/Wap/css/lanren.css"> 
	</head>
	<body>	
		<div class="wenx_xx">
 		 <div class="mz" style="margin-bottom:10px;font-size:18px;">{$name}</div>
		  <div class="wxzf_price">¥{$price}</div>
		</div>
		<div class="skf_xinf">
		  <div class="all_w"> <span class="bt">收款方</span> <span class="fr">优点讯科技</span> </div>
		</div>
		<span class="ljzf_but all_w" onclick="callpay();">立即支付</span> 

<tc_include file="Wap:nav" /> 
		
	</body>
</html>
 <script type="text/javascript">
	//调用微信JS api 支付
	function jsApiCall()
	{
		WeixinJSBridge.invoke(
			'getBrandWCPayRequest',
			<?php echo $jsApiParameters; ?>,
			function(res){
				WeixinJSBridge.log(res.err_msg);
				//alert(res.err_msg);
				if(res.err_msg == 'get_brand_wcpay_request:ok'){
					window.location.href="http://1.aigowu.cn/index.php/Wap/index/order";
				}else{
					showMsg('交易失败','center');
				}
			}
		);
	}

	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>

我把代码放在压缩包,有需要的可以借鉴一下,自行融入到自身的程序当中

点击下载:https://pjax.cc/content/uploadfile/201803/2e321522051996.zip

本文标签:

版权声明:若无特殊注明,本文皆为《Leek》原创,转载请保留文章出处。

本文链接:Thinkphp 微信支付demo - https://pjax.cc/40.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

允许邮件通知