success(json_decode(WechatService::jsSdk($request->get('url')), true)); } /** * 公众号授权登陆 * @param Request $request * @return mixed * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function auth(Request $request) { $spreadId = intval($request->param('spread')); $login_type = $request->param('login_type', 1); @file_put_contents("auth.txt", json_encode(input())); try { $wechatInfo = WechatService::oauthService($this->cid)->user()->getOriginal(); } catch (\Exception $e) { $this->error(['message' => $e->getMessage(), 'line' => $e->getLine()]); } @file_put_contents("auth.txt", "\r\n" . json_encode($wechatInfo), 8); try { if (!isset($wechatInfo['nickname'])) { try { $wechatInfo = WechatService::getUserInfo($this->cid, $wechatInfo['openid']); } catch (\Exception $e) { $this->error(['message' => $e->getMessage(), 'line' => $e->getLine()]); } if (!$wechatInfo['subscribe'] && !isset($wechatInfo['nickname'])) exit(WechatService::oauthService($this->cid)->scopes(['snsapi_userinfo']) ->redirect($this->request->url(true))->send()); if (isset($wechatInfo['tagid_list'])) $wechatInfo['tagid_list'] = implode(',', $wechatInfo['tagid_list']); } else { if (isset($wechatInfo['privilege'])) unset($wechatInfo['privilege']); if (!UserRelation::where(['openid' => $wechatInfo['openid']])->find()) $wechatInfo['subscribe'] = 0; } $openid = $wechatInfo['openid']; $wechatInfo['cid'] = $this->cid; $params = [$openid, $wechatInfo, $spreadId, $login_type]; @file_put_contents("auth.txt", "\r\n" . json_encode($params), 8); Hook::exec("\\app\admin\\behavior\\User", "WechatOauth", $params); $user = User::where('id', UserRelation::openidToUid($openid, 'openid'))->find(); if (!$user) $this->error('获取用户失败'); $this->auth->direct($user['id']); // 设置推广关系 User::setSpread(intval($spreadId), $user->id); return $this->success('登录成功', $this->auth->getUserinfo()); } catch (Exception $e) { @file_put_contents("error.txt", $e->getFile() . '-', $e->getLine(), '-' . $e->getMessage()); } } /** * 扣款服务 * @param Request $request * @return mixed * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function signing(Request $request) { $price = intval($request->param('price')); $uid = intval($request->param('uid')); $plan_id = WechatPlan::where('price',$price)->value('plan_id'); $p_id = WechatPlan::where('price',$price)->value('id'); $plan_id=11; $p_id=12; // try { // $notify_url=Request::instance()->domain() . "/api/wechat/notify/" . $cid; //回调接口 $app_id='wx5681205d1ef4d9d3'; $mch_id ='1623907696'; $sub_mch_id =''; $contract_code =$this->generateRandomString(12); $notify_url=Request::instance()->domain() . "/api/wechat/notify/" . 12; //回调接口 $cid 企业id // $num = time() + mt_rand(10, 999999) . '' . substr($msec, 2, 3);//生成随机数 // $request_serial=$this->generateUniqueSerialNumber(); $request_serial=WechatPlanRecord::where('is_signing',0)->order('request_serial desc')->value('request_serial'); if (empty($request_serial)){ $request_serial=100000; }else{ $request_serial=$request_serial+1; } $contract_display_account='咸宁红十字'; $timestamp=time(); $version='1.0'; $array = array( 'appid' => $app_id, 'mch_id' => $mch_id, 'plan_id' => $plan_id, // 'sub_mch_id' => $sub_mch_id, 'contract_code' => $contract_code, 'notify_url' => $notify_url, 'contract_display_account' => $contract_display_account, 'request_serial' => $request_serial, 'timestamp' => $timestamp, 'version' => $version, ); ksort($array); $xml=''; foreach ($array as $key => $value){ $xml=$xml.$key.'='.$value.'&'; } $xml=substr($xml, 0, -1); @file_put_contents("quanju.txt", json_encode($xml)."-签约内容\r\n", 8); $sign=$this->md5_sign($xml,'192006250b4c09247ec02edce69f6a2d'); @file_put_contents("quanju.txt", $sign."-签名\r\n", 8); $url='https://api.mch.weixin.qq.com/papay/entrustweb?'.$xml.'&sign='. $sign; @file_put_contents("quanju.txt", $url."-链接\r\n", 8); var_dump($url); // $response = $this->curl_get($url); // $url=$this->OfficialAccountSigning($app_id,$mch_id,$plan_id,$contract_code,$request_serial,$contract_display_account,$notify_url,$version,$sign,$timestamp); // @file_put_contents("quanju.txt", $response.'返回链接'); WechatPlanRecord::create([ 'uid' => $uid, 'plan_id' => $p_id, 'price' => $price, 'is_signing' => 0, 'request_serial' => $request_serial, 'contract_code' => $contract_code, 'contract_display_account' => $contract_display_account, 'createtime' => time(), 'cid' => 12, 'wechat_plan_id' => $plan_id, ]); die(); return 1; // } catch (Exception $e) { // var_dump($e->getMessage()); // @file_put_contents("error.txt", $e->getFile() . '-', $e->getLine(), '-' . $e->getMessage()); // } } public function generateRandomString($length) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters); $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } // 生成唯一序列号 public function generateUniqueSerialNumber() { // 使用uniqid生成一个唯一ID,并去除前缀的'0' $uniqueId = ltrim(uniqid('', true), '0'); // 确保生成的ID不以0开头且长度不超过19位(int64的最大长度) while (strlen($uniqueId) > 19 || substr($uniqueId, 0, 1) === '0') { $uniqueId = ltrim(uniqid('', true), '0'); } // 将生成的ID转换为纯数字 $serialNumber = preg_replace('/\D/', '', $uniqueId); // 确保生成的序列号不以0开头 if (substr($serialNumber, 0, 1) === '0') { $serialNumber = generateUniqueSerialNumber(); // 递归调用以重新生成 } return $serialNumber; } public function curl_post($url = '', $name = array(), $timeout = 100) { // var_dump($url);die(); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, false); //是否显示头部 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//是否直接输出到屏幕 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 curl_setopt($ch, CURLOPT_POST, true); //是否以post方式 //设置post数据 $post_data = json_encode($name); // curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $content = curl_exec($ch); // var_dump($content);die(); curl_close($ch); $content = json_decode($content, true); return $content; } public function curl_get(string $url, $timeout = 100) { // if (!empty($name)) { // $data = '&'; // foreach ($name as $k => $v) { // $data = $data . $k . '=' . $v.'&'; // } // $url = $url . $data; // } // $url = substr($url,0,-1); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, false); //是否显示头部 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//是否直接输出到屏幕 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 $content = curl_exec($ch); curl_close($ch); $content = json_decode($content,true); // $content = (array)$content; // var_dump($content); return $content; } public function md5_sign($data, $key){ $stringSignTemp=$data."&key=$key"; //注:key为商户平台设置的密钥key $sign=MD5($stringSignTemp); //MD5加密 $sign=strtoupper($sign); //大写 return $sign; } /** * 公众号签约 * see:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_1.shtml * @param array $data * * @return array * @throws AuthorizeFailedException */ public function OfficialAccountSigning(string $appid,string $mch_id, string $plan_id, string $contract_code, string $request_serial, string $contract_display_account, string $notify_url, string $version, string $sign,string $timestamp): array { $url = 'https://api.mch.weixin.qq.com/papay/entrustweb'; $info = [ 'appid' => $appid, //应用ID 'mch_id' => $mch_id, //商户号 'plan_id' => $plan_id, //模板id // 'sub_mch_id' => $sub_mch_id, //子商户号 'contract_code' => $contract_code, //签约协议号 'request_serial' => $request_serial, //请求序列号 'contract_display_account' => $contract_display_account, //用户账户展示名称 'notify_url' => $notify_url, //回调通知url 'version' => $version, //版本号 固定值1.0 'sign' => $sign, //签名 'timestamp' => $timestamp ]; $response = $this->curl_get($url, $info); return $response; } public function test() { return '123456'; } public function signing_plan() { $this->success('获取成功',WechatPlan::where('cid',$this->cid)->select()); } }