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')); $cid = intval($request->param('cid')); $plan_id = WechatPlan::where('price', $price)->value('plan_id'); $p_id = WechatPlan::where('price', $price)->value('id'); // var_dump($plan_id); // var_dump($p_id);die(); // $plan_id = 11; // $p_id = 12; try { // $notify_url=Request::instance()->domain() . "/api/wechat/notify/" . $cid; //回调接口 // $app_id = 'wx5681205d1ef4d9d3'; $app_id = Company::where('id', $cid)->value('wechat_appid'); // $mch_id = '1623907696'; $mch_id = Company::where('id', $cid)->value('pay_weixin_mchid'); $key = Company::where('id', $cid)->value('pay_weixin_key'); @file_put_contents("quanju.txt", $key . "-key\r\n", 8); $contract_code = $this->generateRandomString(12); $notify_url = Request::instance()->domain() . "/api/wechat/notify/" . $cid; //回调接口 $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 = User::where('id', $uid)->value('nickname'); if (empty($contract_display_account)){ $this->error('用户不存在!'); } $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", $xml . "-签约内容\r\n", 8); $sign = $this->md5_sign($xml, $key); @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 . "-返回链接\r\n", 8); WechatPlanRecord::create([ 'uid' => $uid, 'plan_id' => $plan_id, 'price' => $price, 'is_signing' => 0, 'request_serial' => $request_serial, 'contract_code' => $contract_code, 'contract_display_account' => $contract_display_account, 'createtime' => time(), 'cid' => 12, ]); // die(); $this->success('获取成功', $response); // return $response; } catch (Exception $e) { // var_dump($e->getMessage()); @file_put_contents("quanju.txt", $e->getMessage() . "-报错信息\r\n", 8); @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 delete_signing(Request $request) { $record_id = intval($request->param('id')); $uid = intval($request->param('uid')); $cid = intval($request->param('uid')); try { // $notify_url=Request::instance()->domain() . "/api/wechat/notify/" . $cid; //回调接口 $app_id = Company::where('id', $cid)->value('wechat_appid'); $mch_id = Company::where('id', $cid)->value('pay_weixin_mchid'); $contract_code = WechatPlanRecord::where('id', $record_id)->value('contract_code'); $plan_id = WechatPlanRecord::where('id', $record_id)->value('plan_id'); $contract_termination_remark = '解约备注'; $version = '1.0'; $array = array( 'appid' => $app_id, 'mch_id' => $mch_id, 'plan_id' => $plan_id, 'contract_code' => $contract_code, 'contract_termination_remark' => $contract_termination_remark, '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/deletecontract?' . $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::where('id', $record_id)->update(['is_signing' => 1]); die(); return 1; } 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 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);die(); 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', 12)->select()); } // 用户签约列表 public function user_signing(Request $request) { $uid = intval($request->param('uid')); $this->success('获取成功', WechatPlanRecord::where('uid', $uid)->where('is_signing', 0)->select()); } }