Wechat.php 9.2 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 = config("site.appid");
			$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
			echo $code;
			die;
			//解析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给后台
				返回 token  前端存储 每次请求 放在header里
	*/

	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();
			//登录成功 存储服务器本地
			$res=$this->auth->direct($user['id']);

			//返回给前端
			$user_id = $user['id'];
		}catch(\Exception $e){
			$this->error($e->getMessage());
		}
		if($user_id !=0){
			$data['token'] = $this->auth->getToken();
			$data['user_info'] = $user;
			$this->success('完成',$data);
		}else{
			$this->error('code处理失败');
		}

	}



	/*
		3.订单支付 前端请求
			3.1 入库 订单状态
			3.2 入库完成 处理支付接口 返回给前端 成功下单的接口结构
			{"code":1,"msg":"下单成功","time":"1685349626","data":{"appId":"wx1c3cc5b4e2006be2","nonceStr":"647464fb20f0c","package":"prepay_id=wx29164027049900e6020fe5bc7628300000","signType":"MD5","paySign":"7EC048B24D643F7115DC0D6063A17E62","timestamp":"1685349627"}}
			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($order_no = ''){
		$user_id = $this->auth->id;
		
		if(empty($user_id)){
			return $this->error('用户信息错误');
		}
		$userInfo = Db::name('user')->where(['id'=>$user_id])->find();

		$out_trade_no = $order_no ='168532907259455';
		$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('下单失败',$result);
		}

	}


	/*
		微信支付回调信息
	*/
	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);
		*/
	}
}