'红包个数超出限制', '66228705' => '总金额超出限制', '66228706' => '总金额不足以按最小金额领取每个红包', '66228707' => '商户签名校验失败', '66228708' => '重入??', '66228709' => 'openid转换uin失败', '66228711' => '商户订单中的商户号有误', '66228712' => '商户订单中的日期超过范围', '66228713' => '余额不足', '66228715' => '用户未关注公众号,发送AIO消息失败', '66229716' => '用户禁用公众号,发AIO消息失败' ]; private $_requestParams = []; /** * @param string $value */ public function setMchName(string $value) { $this->_requestParams['mch_name'] = $value; } /** * @param string $value */ public function setActName(string $value) { $this->_requestParams['act_name'] = $value; } /** * @param string $value */ public function setWishing(string $value) { $this->_requestParams['wishing'] = $value; } /** * @param string $value */ public function setIconId($value) { $this->_requestParams['icon_id'] = $value; } /** * @param string $value */ public function setBannerId($value) { $this->_requestParams['banner_id'] = $value; } /** * @param $mch_billno * @param $openId * @param $price * @return mixed * @throws Exception */ public function mch_send($mch_billno, $openId, $price) { $client = HttpClient::NewRequest(); $client->setIsSSL(true); $client->setSslCertFile($this->getConfig()->getSslCert()); $client->setSslKeyFile($this->getConfig()->getSslKey()); $client->setCa($this->getConfig()->getSslCa()); $client->setUseSwoole($this->getConfig()->isUsrSwoole()); $client->setHost('api.qpay.qq.com'); $client->setCallback(function ($response, $requestParam) { $json = json_decode($response, true); if (isset($json['return_code']) && $json['return_code'] != 'SUCCESS') { $array['code'] = 500; $array['message'] = $json['return_msg'] ?? $json['retmsg']; } else if ($json['retcode'] != 0) { if (empty($json['retmsg']) && isset($this->_errors[$json['retcode']])) { $json['retmsg'] = $this->_errors[$json['retcode']]; } $array['code'] = $json['retcode']; $array['message'] = $json['retmsg']; } else { $array['code'] = 0; $array['message'] = $json['retmsg']; $array['data'] = ['listid' => $json['listid']]; } $array['data']['request'] = $requestParam; return new Result($array); }); $response = $client->post($this->_cash, $this->orderConfig($mch_billno, $openId, $price)); if (!$response->isResultsOK()) { throw new Exception($response->getMessage()); } return $response->getData('listid'); } /** * @param $mch_billno * @param $openId * @param $price * @return array */ private function orderConfig($mch_billno, $openId, $price) { $requestParam['charset'] = 1; $requestParam['nonce_str'] = Help::random(32); $requestParam['mch_billno'] = $mch_billno; $requestParam['mch_id'] = $this->getConfig()->getMchId(); $requestParam['qqappid'] = $this->getConfig()->getAppid(); $requestParam['re_openid'] = $openId; $requestParam['total_amount'] = $price * 100; $requestParam['min_value'] = $price * 100; $requestParam['max_value'] = $price * 100; $requestParam['total_num'] = 1; $requestParam['notify_url'] = $this->getConfig()->getNotifyUrl(); if (!empty($this->_requestParams) && is_array($this->_requestParams)) { $requestParam = array_merge($requestParam, $this->_requestParams); } $requestParam['sign'] = Help::sign($requestParam, $this->getConfig()->getKey(), 'MD5'); return $requestParam; } /** * @return string * @throws Exception */ public function mchOrderNo() { return implode([ $this->getConfig()->getMchId(), date('Ymd'), random_int(11, 99), date('His'), random_int(11, 99) ]); } /** * @param array $requestParams * @return bool */ public function validator(array $requestParams) { $notifySign = $requestParams['sign']; unset($requestParams['sign']); $sign = Help::sign($requestParams, $this->getConfig()->getKey(), 'MD5'); if ($sign !== $notifySign) { return false; } return true; } }