千家信息网

如何编写PHP微信支付类demo

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容主要讲解"如何编写PHP微信支付类demo",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何编写PHP微信支付类demo"吧!
千家信息网最后更新 2025年01月19日如何编写PHP微信支付类demo

本篇内容主要讲解"如何编写PHP微信支付类demo",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何编写PHP微信支付类demo"吧!

mchid = $mchid; // 微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送    $this->appid = $appid; //公众号APPID 通过微信支付商户资料审核后邮件发送    $this->key = $key;   //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥  }  /**   * @param string $openid 调用【网页授权获取用户信息】接口获取到用户在该公众号下的Openid   * @param float $totalFee 收款总费用 单位元   * @param string $outTradeNo 唯一的订单号   * @param string $orderName 订单名称   * @param string $notifyUrl 支付结果通知url 不要有问号   *   https://mp.weixin.qq.com/ 微信支付-开发配置-测试目录   *   测试目录 http://mp.izhanlue.com/paytest/  最后需要斜线,(需要精确到二级或三级目录)   * @return string   */  public function createJsBizPackage($openid, $totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp)  {    $config = array(      'mch_id' => $this->mchid,      'appid' => $this->appid,      'key' => $this->key,    );    $unified = array(      'appid' => $config['appid'],      'attach' => '支付',             //商家数据包,原样返回      'body' => $orderName,      'mch_id' => $config['mch_id'],      'nonce_str' => self::createNonceStr(),      'notify_url' => $notifyUrl,      'openid' => $openid,            //rade_type=JSAPI,此参数必传      'out_trade_no' => $outTradeNo,      'spbill_create_ip' => '127.0.0.1',      'total_fee' => intval($totalFee * 100),       //单位 转为分      'trade_type' => 'JSAPI',    );    $unified['sign'] = self::getSign($unified, $config['key']);    $responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified));    /*                                                */    $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);    if ($unifiedOrder === false) {      die('parse xml error');    }    if ($unifiedOrder->return_code != 'SUCCESS') {      die($unifiedOrder->return_msg);    }    if ($unifiedOrder->result_code != 'SUCCESS') {      die($unifiedOrder->err_code);      /*      NOAUTH 商户无此接口权限      NOTENOUGH 余额不足      ORDERPAID 商户订单已支付      ORDERCLOSED 订单已关闭      SYSTEMERROR 系统错误      APPID_NOT_EXIST   APPID不存在      MCHID_NOT_EXIST MCHID不存在      APPID_MCHID_NOT_MATCH appid和mch_id不匹配      LACK_PARAMS 缺少参数      OUT_TRADE_NO_USED 商户订单号重复      SIGNERROR 签名错误      XML_FORMAT_ERROR XML格式错误      REQUIRE_POST_METHOD 请使用post方法      POST_DATA_EMPTY post数据为空      NOT_UTF8 编码格式错误      */    }    //$unifiedOrder->trade_type 交易类型 调用接口提交的交易类型,取值如下:JSAPI,NATIVE,APP    //$unifiedOrder->prepay_id 预支付交易会话标识 微信生成的预支付回话标识,用于后续接口调用中使用,该值有效期为2小时    //$unifiedOrder->code_url 二维码链接 trade_type为NATIVE是有返回,可将该参数值生成二维码展示出来进行扫码支付    $arr = array(      "appId" => $config['appid'],      "timeStamp" => $timestamp,      "nonceStr" => self::createNonceStr(),      "package" => "prepay_id=" . $unifiedOrder->prepay_id,      "signType" => 'MD5',    );    $arr['paySign'] = self::getSign($arr, $config['key']);    return $arr;  }  public function notify()  {    $config = array(      'mch_id' => $this->mchid,      'appid' => $this->appid,      'key' => $this->key,    );    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];    //error_log($postStr, 3, './str.txt');    /*    $postStr = '                                                            1            ';    */    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);    if ($postObj === false) {      die('parse xml error');    }    if ($postObj->return_code != 'SUCCESS') {      die($postObj->return_msg);    }    if ($postObj->result_code != 'SUCCESS') {      die($postObj->err_code);    }    $arr = (array)$postObj;    unset($arr['sign']);    if (self::getSign($arr, $config['key']) == $postObj->sign) {      // $mch_id = $postObj->mch_id; //微信支付分配的商户号      // $appid = $postObj->appid; //微信分配的公众账号ID      // $openid = $postObj->openid; //用户在商户appid下的唯一标识      // $transaction_id = $postObj->transaction_id;//微信支付订单号      // $out_trade_no = $postObj->out_trade_no;//商户订单号      // $total_fee = $postObj->total_fee; //订单总金额,单位为分      // $is_subscribe = $postObj->is_subscribe; //用户是否关注公众账号,Y-关注,N-未关注,仅在公众账号类型支付有效      // $attach = $postObj->attach;//商家数据包,原样返回      // $time_end = $postObj->time_end;//支付完成时间      echo '';      return $postObj;    }  }  /**   * curl get   *   * @param string $url   * @param array $options   * @return mixed   */  public static function curlGet($url = '', $options = array())  {    $ch = curl_init($url);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    curl_setopt($ch, CURLOPT_TIMEOUT, 30);    if (!empty($options)) {      curl_setopt_array($ch, $options);    }    //https请求 不验证证书和host    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);    $data = curl_exec($ch);    curl_close($ch);    return $data;  }  public static function curlPost($url = '', $postData = '', $options = array())  {    if (is_array($postData)) {      $postData = http_build_query($postData);    }    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    curl_setopt($ch, CURLOPT_POST, 1);    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数    if (!empty($options)) {      curl_setopt_array($ch, $options);    }    //https请求 不验证证书和host    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);    $data = curl_exec($ch);    curl_close($ch);    return $data;  }  public static function createNonceStr($length = 16)  {    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';    $str = '';    for ($i = 0; $i < $length; $i++) {      $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);    }    return $str;  }  public static function arrayToXml($arr)  {    $xml = "";    foreach ($arr as $key => $val) {      if (is_numeric($val)) {        $xml .= "<" . $key . ">" . $val . "";      } else        $xml .= "<" . $key . ">";    }    $xml .= "";    return $xml;  }  /**   * 例如:   * appid:  wxd930ea5d5a258f4f   * mch_id:  10000100   * device_info: 1000   * Body:  test   * nonce_str: ibuaiVcKdpRxkhJA   * 第一步:对参数按照 key=value 的格式,并按照参数名 ASCII 字典序排序如下:   * stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_i   * d=10000100&nonce_str=ibuaiVcKdpRxkhJA";   * 第二步:拼接支付密钥:   * stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d"   * sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7"   */  public static function getSign($params, $key)  {    ksort($params, SORT_STRING);    $unSignParaString = self::formatQueryParaMap($params, false);    $signStr = strtoupper(md5($unSignParaString . "&key=" . $key));    return $signStr;  }  protected static function formatQueryParaMap($paraMap, $urlEncode = false)  {    $buff = "";    ksort($paraMap);    foreach ($paraMap as $k => $v) {      if (null != $v && "null" != $v) {        if ($urlEncode) {          $v = urlencode($v);        }        $buff .= $k . "=" . $v . "&";      }    }    $reqPar = '';    if (strlen($buff) > 0) {      $reqPar = substr($buff, 0, strlen($buff) - 1);    }    return $reqPar;  }}

到此,相信大家对"如何编写PHP微信支付类demo"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

支付 商户 订单 公众 参数 接口 用户 订单号 错误 单位 密钥 数据 标识 格式 目录 类型 账号 交易 有效 安全 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小米是科技还是互联网公司 闵行区机械软件开发定制价格 军校网络安全教育内容 查找外文学术文章的摘要型数据库 思科网络技术第八章答案 闵行区电子网络技术代理商 计算机3级网络技术考试内容 高新区安卓软件开发师 常见的数据库应用技术 沃高网络技术有限公司 最新高速服务器下载 无线网没有网络安全 走火小说软件开发 数据库将字段改为非必填 我的世界网易服务器咋加名字前缀 带gui的服务器作用 软件开发公司工资 办公软件开发排行榜 虚拟服务器哪里买好 影院售票系统数据库设计 宽带网络技术课程实验 查找外文学术文章的摘要型数据库 关于网络安全进校园的征文 卫生健康网络安全大赛知识库 网络安全文明的七言律诗 北京科技大学互联网2021 福建电脑服务器租用云主机 数据库pagesize是啥 黑校园网数据库 客户端交换服务器地址是网关吗
0