| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- <?php
- namespace app\api\controller;
- use app\admin\model\WechatPlan;
- use app\admin\model\WechatPlanRecord;
- use app\common\model\UserRelation;
- use app\common\controller\Api;
- use app\common\library\Auth;
- use liuniu\WechatService;
- use app\common\model\User;
- use Overtrue\Socialite\AuthorizeFailedException;
- use think\Exception;
- use think\Hook;
- use think\Request;
- class Wechat extends Api
- {
- protected $noNeedLogin = ['*'];
- /**
- * 微信公众号服务
- * @return \think\Response
- */
- public function serve()
- {
- ob_clean();
- return WechatService::serve();
- }
- /**
- * 支付异步回调
- */
- public function notify()
- {
- ob_clean();
- WechatService::handleNotify(input('cid', 0));
- }
- /**
- * 公众号权限配置信息获取
- * @param Request $request
- * @return mixed
- */
- public function config(Request $request)
- {
- return app('json')->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());
- }
- }
|