PHP Thinkphp5.0对接美团API接口 实现卡卷核销功能

好久没有更新文章了。不知道关注我的小伙伴们是不是已经不在关注我了。最近在忙着一些推广运营的事情,所以没有更新,

这几天接到一个项目,需要对接美团API接口,实现核销功能。现在就来给大家展示具体代码,

php 复制代码
/* @FunctionDesc:美团卡卷 查询、验券(核销),撤销验券
   * @Params:  qr_code 卡券券码
   *           open_shop_uuid 店铺id (根据session值 获取得到)
   *           deal_id 套餐id 查询接口获得
   *           type 功能类型 值为 save 验券(核销)、值为 cancel 验券(核销)、其他值时为查询
   * */
  public function tuangou_hexiao(){
    //
    $qr_cpde = $_GET['qr_code'];
    $open_shop_uuid = $_GET['open_shop_uuid'];
 
    // $arr 为数组 里面为应用参数
    $appKey = "111111111";
    $secret = "11111111111111111"; //秘钥
    $timestamp = date('Y-m-d H:i:s');
    $format = 'json';
    $v = 1;
    $sign_method = 'MD5';
    //因为功能要实现在小程序,所以获取的必要信息要存在文件中,有必要时拿出来
    //不是必要行为,
    $file = $this->readFile();
 
    $data = [
      'app_key' => $appKey,
      'timestamp' => $timestamp,
      'sign_method' => $sign_method,
      'format' => $format,
      'v' => $v,
      //此处的session值,我原本是存在文件中的,
      //如果你不需要存文件,那你就当做参数传递过来
      'session' => $file['session'],
    ];
    //根据不同的操作类型配置不同的参数
    //具体参数含义见 https://open.dianping.com/document/v2?docId=6000176&rootDocId=5000
    if($_GET['type']=='save'){
      $arr = [
        'requestid' => '123',
        'count'=>1,
        'receipt_code' => $qr_cpde,
        'open_shop_uuid' => $open_shop_uuid,
        'app_shop_account' => '账号',
        'app_shop_accountname' => '账号名称',
      ];
      $url = 'https://openapi.dianping.com/router/tuangou/receipt/consume';//验券(核销)
    }elseif ($_GET['type']=='cancel'){
       $arr = [
          'app_deal_id' => $_GET['deal_id'],
          'receipt_code' => $qr_cpde,
          'open_shop_uuid' => $open_shop_uuid,
          'app_shop_account' => '账号',
          'app_shop_accountname' => '账号名称',
        ];
      $url = 'https://openapi.dianping.com/router/tuangou/receipt/reverseconsume';//撤销
    }else{
      $arr = [
        'receipt_code' => $qr_cpde,
        'open_shop_uuid' => $open_shop_uuid,
      ];
      $url = 'https://openapi.dianping.com/router/tuangou/receipt/prepare';//查询券
    }
 
    $data = array_merge($data, $arr);
    ksort($data);
    $sign = $this->call_sign($secret, $data);//获取签名
    $data['sign'] = $sign;
    $data = array_merge($data, $arr);
    $postdata = http_build_query($data);
    $tmpInfo= $this->curl_post($url,$postdata);
    $this->ReturnSucess($tmpInfo);
 
  }
 
  /* @FunctionDesc:商家授权
   * @Params:  auth_code 用户同意授权后,回调得到的值,根据该值可获取session(也就是auth_token)
   * */
  public function get_auth(){
    $auth_code = $_GET["auth_code"];
    //判断是否为回调
    if(empty($auth_code)) {
      $app_key='11111111111';
      $state='teststate';
      //回调的url,我配置为当前方法。
      $redirect_url='https:你的路径/index/get_auth';
      $scope='tuangou';
      $url='https://e.dianping.com/dz-open/merchant/auth?';
      $data=[
        'app_key' =>$app_key,
        'state' => $state,
        'redirect_url'=>$redirect_url
      ];
      $postdata = http_build_query($data);
      header("Location: $url$postdata");
    } else {
      trace('回调成功'.$auth_code);
      //根据auth_code 获取session的授权码
      $tmpInfo = $this->get_session($auth_code);
      //根据$session $bid 获取店铺id
      $shopInfo = $this->get_shopid($tmpInfo['access_token'],$tmpInfo['bid']);
    }
  }
 
 
  //授权获取session
  public function get_session($auth_code){
    $app_key='1111111';
    $app_secret='111111111111111111111';
    $grant_type='authorization_code';
    $redirect_url='https:你的路径/index/get_auth';
    $data=[
      'app_key' =>$app_key,
      'app_secret' => $app_secret,
      'redirect_url' =>$redirect_url,
      'auth_code' =>$auth_code,
      'grant_type' =>$grant_type
    ];
    $postdata = http_build_query($data);
    $url='https://openapi.dianping.com/router/oauth/token';
    $tmpInfo=$this->curl_post($url,$postdata);
    return $tmpInfo;
  }
 
 
  //获取所有店铺的id
  public function get_shopid($session,$bid){
    $app_key='11111111';
    $secret = "111111111111111111111111"; //秘钥
    $sign_method='MD5';
    $timestamp = date('Y-m-d H:i:s');
    $format = 'json';
    $v = 1;
    $offset =0;
    $limit = 20;
    $url='https://openapi.dianping.com/router/oauth/session/scope?';
    $data=[
      'app_key' =>$app_key,
      'sign_method' => $sign_method,
      'timestamp' =>$timestamp,
      'format' =>$format,
      'v' =>$v,
      'session' =>$session,
      'bid' =>$bid,
      'offset' =>$offset,
      'limit' =>$limit,
    ];
    ksort($data);
    $sign = $this->call_sign($secret, $data);
    $data['sign'] = $sign;
    $postdata = http_build_query($data);
    $tmpInfo=$this->curl_get($url.$postdata);
    return $tmpInfo;
  }
  /*
   * 写入文件
   * */
  public function createFile($data){
    //创建一个文件
    $file = fopen('MeiTuan.txt','w');
 
    //写入文件
    fwrite($file, json_encode($data));
 
    //关闭文件
    fclose($file);
  }
  /*
   * 读取文件
   * */
  public function readFile(){
    $file = fopen('MeiTuan.txt','r');
 
    $data = fread( $file , filesize('MeiTuan.txt') );
 
    fclose($file);
 
    return json_decode( $data , true );
  }
 
  /**
   * 计算签名
   *
   * @param $app_secret 三方app_secret
   * @param $req_param 请求参数集合,包括公共参数和业务参数
   * @return string md5签名
   */
  function call_sign($secret, $data)
  {
    // 排序所有请求参数
    ksort($data);
    $src_value = "";
    // 按照key1value1key2value2...keynvaluen拼接
    foreach ($data as $key => $value) {
      $src_value .= ($key . $value);
    }
    //计算md5
    return md5($secret . $src_value . $secret);
  }
 
  //post请求
  function curl_post($url,$postdata){
    $curl = curl_init(); // 启动一个CURL会话
    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检测
    curl_setopt($curl, CURLOPT_HTTPHEADER, array(
      'Expect:'
    )); // 解决数据包大不能提交
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
    curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata); // Post提交的数据包
    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循
    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
// curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
    $tmpInfo = curl_exec($curl); // 执行操作
    if (curl_errno($curl)) {
      echo 'Errno' . curl_error($curl);
    }
    curl_close($curl); // 关键CURL会话
    $tmpInfo=json_decode($tmpInfo,true);
    return $tmpInfo;
  }
 
  //get请求
  private function curl_get($url) {
    //初使化curl
    $curl = curl_init();
    //请求的url,由形参传入
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检测
    curl_setopt($curl, CURLOPT_HTTPHEADER, array(
      'Expect:'
    )); // 解决数据包大不能提交
    //将得到的数据返回
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //不处理头信息
    curl_setopt($curl, CURLOPT_HEADER, 0);
    //连接超过10秒超时
    curl_setopt($curl, CURLOPT_TIMEOUT, 30);
    curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    //执行curl
    $output = curl_exec($curl);
    if (curl_errno($curl)) {
      echo 'Errno' . curl_error($curl);
    }
    //关闭资源
    curl_close($curl);
    //返回内容
    $tmpInfo=json_decode($output,true);
    return $tmpInfo;
  }
}

这段代码是实现美团核销的功能。 亲测有效,如果有小伙伴需要的话,可否动动你的手指,给我点个关注呢。

相关推荐
逻辑驱动的ken2 分钟前
Java高频面试考点场景题05
java·开发语言·深度学习·求职招聘·春招
Royzst14 分钟前
String方法
java·开发语言
学习使我健康16 分钟前
Android 事件分发机制
android·java·前端
代码羊羊19 分钟前
Rust基础类型与变量全解析
开发语言·后端·rust
贵沫末24 分钟前
Claude Code For VS Code安装以及跳过认证
android
纤纡.26 分钟前
基于 PyQt5 的桌面应用开发实战:登录、预测、计算器、摄像头多功能系统
开发语言·人工智能·qt·计算机视觉
于慨30 分钟前
flutter基础组件用法
开发语言·javascript·flutter
历程里程碑31 分钟前
二叉树---翻转二叉树
开发语言·c++·elasticsearch·链表·搜索引擎·tornado·dash
00后程序员张36 分钟前
完整教程:如何将iOS应用程序提交到App Store审核和上架
android·macos·ios·小程序·uni-app·cocoa·iphone
aq55356001 小时前
ThinkPHP5.x核心特性全解析
android·数据库·oracle·php·laravel