Wechat.php 8.7 KB
<?php

namespace app\api\controller\v1;
use app\server\Wechat as WehcatModule;
use app\common\controller\Api;

use think\Cache;
use think\Config;
use think\Db;
use think\Response;
use think\Validate;

/**
 * 首页公共
 */
class Wechat extends Api
{
    protected $noNeedLogin = ["*"];
    protected $noNeedRight = '*';

    public function _initialize()
    {
        parent::_initialize();

    }

    /*
		1.前端获取jsjdk的配置
	*/
	public function get_jsjdk_config(){
		try{
		$app = WehcatModule::getInstance()->initWechat();
		$APIs = ['updateAppMessageShareData','updateTimelineShareData','onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone','chooseWXPay'];
		$config = $app->jssdk->buildConfig($APIs, true);
		}catch(\Exception $e){
			$this->error($e->getMessage());
		}
		$this->success('配置获取成功', json_decode($config,true));
	}
	
	/*
		服务器跳转授权code测试
		
		https://coupon.xp.yn.cn/index.php/api/v1/Wechat/test_code
	*/
	public function test_code(){
		$code = request()->param('code');
		$app = WehcatModule::getInstance()->initWechat();
		if(empty($code)){
			//跳转官方
			$APPID = 'wxb9b259e7a17bda27';
			$REDIRECT_URI = urlencode('https://coupon.xp.yn.cn/index.php/api/v1/Wechat/test_code');
			$SCOPE = 'snsapi_userinfo';//snsapi_base
			$redirect = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$APPID&redirect_uri=$REDIRECT_URI&response_type=code&scope=$SCOPE&state=STATE#wechat_redirect";
			$curUrl = request()->url(true);
			header("Location:".$redirect);
			
		}else{
			//解析code
			$user = $app->oauth->user();
			
			var_dump($user);die;
			/*	
			$user的数据结构 snsapi_userinfo 授权获取
			object(Overtrue\Socialite\User)#143 (1) {
				  ["attributes":protected]=>
				  array(10) {
					["id"]=>
					string(28) "oFycus-NxBBtBjfyd_xClnPrdaok"
					["name"]=>
					string(23) "app.微信开发 陈工"
					["nickname"]=>
					string(23) "app.微信开发 陈工"
					["avatar"]=>
					string(134) "https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJFicTnPRiaic62m4HY4YxrHPRKa92HQrvPOcYRAJSKLRYwCibFWuJCXUCoib9QpE2rKbs4WVVoXVDticdQ/132"
					["email"]=>
					NULL
					["original"]=>
					array(9) {
					  ["openid"]=>
					  string(28) "oFycus-NxBBtBjfyd_xClnPrdaok"
					  ["nickname"]=>
					  string(23) "app.微信开发 陈工"
					  ["sex"]=>
					  int(0)
					  ["language"]=>
					  string(0) ""
					  ["city"]=>
					  string(0) ""
					  ["province"]=>
					  string(0) ""
					  ["country"]=>
					  string(0) ""
					  ["headimgurl"]=>
					  string(134) "https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJFicTnPRiaic62m4HY4YxrHPRKa92HQrvPOcYRAJSKLRYwCibFWuJCXUCoib9QpE2rKbs4WVVoXVDticdQ/132"
					  ["privilege"]=>
					  array(0) {
					  }
					}
					["token"]=>
					string(110) "69_a0ecHFb5w81Cen3R11WfYMO2nD88jiyhsLC7jfqmCYC71maesd2OaDEvH4LaQAZsYfejWGdGYEGRzKjCQu8kX7FBZc4_nJ6so3Cxn9E_mt0"
					["access_token"]=>
					string(110) "69_a0ecHFb5w81Cen3R11WfYMO2nD88jiyhsLC7jfqmCYC71maesd2OaDEvH4LaQAZsYfejWGdGYEGRzKjCQu8kX7FBZc4_nJ6so3Cxn9E_mt0"
					["refresh_token"]=>
					string(110) "69_tFnfQInYcufQQoK5DpstHgucGKGnZjA_Jido5TLyIR1ye3GNYnZS0eJLv5kJ7zJuoJiHD10mzH1wrLicGaFdet_NYkGTAhVZ17QIPMzKkr4"
					["provider"]=>
					string(6) "WeChat"
				  }
				}
				$user的数据结构 静默获取 snsapi_base
				{
					"id": "oFycus-NxBBtBjfyd_xClnPrdaok",
					"name": null,
					"nickname": null,
					"avatar": null,
					"email": null,
					"original": {
						"access_token": "69_SqtOdZrnGsLIb4LE2fg3GLYVTuxff9kqe2rRA8qYAnAhMP4Tgs0adKcoJcW6P5gL1HabRGP0BXFljLdxiSilZePmY0xBEM-6iDGdWk1xNwc",
						"expires_in": 7200,
						"refresh_token": "69_6hfHqqVMWVBIq1OYISnrMbjr5YyO9znGUwI5nwhNMRT_QrShqRd-oxivWYs9SCeLzZbY4Hb0OIejNyz3dNvBMwlPhjXL7C0fhK9wiiB_BLU",
						"openid": "oFycus-NxBBtBjfyd_xClnPrdaok",
						"scope": "snsapi_base"
					},
					"token": "69_SqtOdZrnGsLIb4LE2fg3GLYVTuxff9kqe2rRA8qYAnAhMP4Tgs0adKcoJcW6P5gL1HabRGP0BXFljLdxiSilZePmY0xBEM-6iDGdWk1xNwc",
					"access_token": "69_SqtOdZrnGsLIb4LE2fg3GLYVTuxff9kqe2rRA8qYAnAhMP4Tgs0adKcoJcW6P5gL1HabRGP0BXFljLdxiSilZePmY0xBEM-6iDGdWk1xNwc",
					"refresh_token": "69_6hfHqqVMWVBIq1OYISnrMbjr5YyO9znGUwI5nwhNMRT_QrShqRd-oxivWYs9SCeLzZbY4Hb0OIejNyz3dNvBMwlPhjXL7C0fhK9wiiB_BLU",
					"provider": "WeChat"
				}
			*/
			// $user 可以用的方法:
			// $user->getId();  // 对应微信的 OPENID
			// $user->getNickname(); // 对应微信的 nickname
			// $user->getName(); // 对应微信的 nickname
			// $user->getAvatar(); // 头像网址
			// $user->getOriginal(); // 原始API返回的结果
			// $user->getToken(); // access_token, 比如用于地址共享时使用
		}
	}
	
	/*
		2.网页授权
			2.1前端打开则跳转到授权页 由前端自行配置
			appid 
			redirect_uri前端的路由首位,
			scope=snsapi_base 静默只能获取openid,
			     =snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
			https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
			2.2 由微信回跳后,获取code 和 state 参数,由前端post code给后台
	*/
	
	public function get_user_info_by_code (){
		$user_id = 0;
		try{
			$app = WehcatModule::getInstance()->initWechat();
			$oauth = $app->oauth;
			// 获取 OAuth 授权结果用户信息
			$user = $oauth->user();
			$openid = $user->id;
			//如果是授权获取 则可以有
			$nickname = $user->nickname;
			$avatar = $user->avatar;
			//更新user表信息
			$save['nickname'] = $nickname;
			$save['openid'] = $openid;
			$save['avatar'] = $avatar;
			$save['jointime'] = $save['prevtime'] = $save['logintime'] = time();
			$save['loginip'] = $save['joinip'] = request()->ip();
			$w['openid'] = $openid;
			$user = Db::name('user')->where($w)->find();
			//存在更新否则新增
			if(empty($user)){
				Db::name('user')->insert($save);
			}else{
				Db::name('user')->where($w)->update($save);
			}
			//注册成功 继续注册分销关系
			
			//设置同域下的登录缓存
			$user = Db::name('user')->where($w)->find();
		
			session("user_id",$user['id']);
			//返回给前端
			$user_id = $user['id'];
		}catch(\Exception $e){
			$this->error($e->getMessage());
		}
		if($user_id !=0){
			$this->success('完成',$user_id);
		}else{
			$this->error('code处理失败');
		}
		
	}
	
	/*
		3.订单支付 前端请求
			3.1 入库 订单状态
			3.2 入库完成 处理支付接口 返回给前端
			wx.chooseWXPay({
				timestamp: <?= $config['timestamp'] ?>,
				nonceStr: '<?= $config['nonceStr'] ?>',
				package: '<?= $config['package'] ?>',
				signType: '<?= $config['signType'] ?>',
				paySign: '<?= $config['paySign'] ?>', // 支付签名
				success: function (res) {
					// 支付成功后的回调函数
				}
			});
			3.3 回调修改订单状态
	*/
	public function prepare_order(){
		$user_id = session('user_id');
		$user_id = 1;
		$userInfo = Db::name('user')->where(['id'=>$user_id])->find();
		//3.1订单入库
		
		//3.2 入库完成 处理支付
		$out_trade_no = "O".time().uniqid();
		$app = WehcatModule::getInstance()->initWechatPay();
		$result = $app->order->unify([
			'body' => '腾讯充值中心-QQ会员充值',
			'out_trade_no' => $out_trade_no,
			'total_fee' => 1,
			'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
			'openid' => $userInfo['openid'],
		]);
		if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
			$prepay_id = $result['prepay_id'];
			$jssdk = $app->jssdk;
			$config = $jssdk->sdkConfig($prepay_id);
			return $this->success('下单成功',$config);
			
		}else{
			return $this->error('下单失败');
		}
		
	}
	
	
	/*
		微信支付回调信息
	*/
	public function notify(){
		$app = WehcatModule::getInstance()->initWechatPay();
		$response = $app->handlePaidNotify(function($message, $fail){
			// 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
			file_put_contents("1_cc.log",json_encode($message),FILE_APPEND);
			$order = $message['out_trade_no'];
			if ($message['return_code'] === 'SUCCESS' && $message['result_code'] === 'SUCCESS') {
				
			} else {
				return $fail('通信失败,请稍后再通知我');
			}

			
			return true; // 返回处理完成
		});
		$response->send(); // return $response;
		/*
		$xml = file_get_contents("php://input");
		$xmljson= json_encode(simplexml_load_string($xml, 'SimplexmlElement', LIBxml_NOCDATA));//将对象转换个JSON
		file_put_contents("json.txt",$xmljson);
		$xmlarray=json_decode($xmljson,true);//将json转换成数组
		file_put_contents("1_cc.log",json_encode($xmlarray),FILE_APPEND);
		*/
	}
}