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) { $peice = intval($request->param('peice')); $uid = intval($request->param('uid')); $plan_id = WechatPlan::where('price',$peice)->value('plan_id'); $login_type = $request->param('login_type', 1); @file_put_contents("auth.txt", json_encode(input())); try { // $notify_url=Request::instance()->domain() . "/api/wechat/notify/" . $cid; //回调接口 $app_id='wx5681205d1ef4d9d3'; $mch_id =''; $sub_mch_id =''; $contract_code =$this->generateRandomString(6); $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'); $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); $sign=$this->md5_sign($array,'192006250b4c09247ec02edce69f6a2d'); var_dump($array); var_dump($sign);die(); $url=$this->OfficialAccountSigning($app_id,$mch_id,$plan_id,$contract_code,$request_serial,$contract_display_account,$notify_url,$version,$sign,$timestamp); return $url; } catch (Exception $e) { @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 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_post($url, $info); return $response; } public function test() { return '123456'; } }