Class态贤,代碼是根據(jù)git一個(gè)代碼修改得
<?php
/**
* Email:zhaojunlike@gmail.com
* Date: 2017/2/17
* Time: 8:54
*/
namespace Common\WxRed;
class WeChatReder
{
protected $red_packet_url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
protected $config = [];
protected $parameters;
public function __construct($config = [])
{
$this->config = array_merge($this->config, $config);
}
public function setParameter($k, $v)
{
$this->parameters[$k] = $v;
}
public function getParameter($k)
{
return $this->parameters[$k];
}
public function create_noncestr($length = 16)
{
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
//$str .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
return $str;
}
protected final function check_packet()
{
if ($this->parameters["nonce_str"] == null ||
$this->parameters["mch_billno"] == null ||
$this->parameters["mch_id"] == null ||
$this->parameters["wxappid"] == null ||
$this->parameters["nick_name"] == null ||
$this->parameters["send_name"] == null ||
$this->parameters["re_openid"] == null ||
$this->parameters["total_amount"] == null ||
$this->parameters["max_value"] == null ||
$this->parameters["total_num"] == null ||
$this->parameters["wishing"] == null ||
$this->parameters["client_ip"] == null ||
$this->parameters["act_name"] == null ||
$this->parameters["remark"] == null ||
$this->parameters["min_value"] == null
) {
return false;
}
return true;
}
/**
* 例如:
* appid: wxd930ea5d5a258f4f
* mch_id: 10000100
* device_info: 1000
* Body: test
* nonce_str: ibuaiVcKdpRxkhJA
* 第一步:對(duì)參數(shù)按照 key=value 的格式,并按照參數(shù)名 ASCII 字典序排序如下:
* stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_i
* d=10000100&nonce_str=ibuaiVcKdpRxkhJA";
* 第二步:拼接支付密鑰:
* stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d"
* sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A
* 9CF3B7"
*/
protected function get_sign()
{
if (!isset($this->config['partnerkey']) || $this->check_packet() === false) {
return false;
}
ksort($this->parameters);
$unSignParaString = $this->formatQueryParaMap($this->parameters, false);
return $this->sign($unSignParaString, $this->config['partnerkey']);
}
private function sign($content, $key)
{
$signStr = $content . "&key=" . $key;
return strtoupper(md5($signStr));
}
private function verifySignature($content, $sign, $md5Key)
{
$signStr = $content . "&key=" . $md5Key;
$calculateSign = strtolower(md5($signStr));
$tenpaySign = strtolower($sign);
return $calculateSign == $tenpaySign;
}
//生成紅包接口XML信息
/*
<xml>
<sign>![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]</sign>
<mch_billno>![CDATA[0010010404201411170000046545]]</mch_billno>
<mch_id>![CDATA[888]]</mch_id>
<wxappid>![CDATA[wxcbda96de0b165486]]</wxappid>
<nick_name>![CDATA[nick_name]]</nick_name>
<send_name>![CDATA[send_name]]</send_name>
<re_openid>![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]</re_openid>
<total_amount>![CDATA[200]]</total_amount>
<min_value>![CDATA[200]]</min_value>
<max_value>![CDATA[200]]</max_value>
<total_num>![CDATA[1]]</total_num>
<wishing>![CDATA[恭喜發(fā)財(cái)]]</wishing>
<client_ip>![CDATA[127.0.0.1]]</client_ip>
<act_name>![CDATA[新年紅包]]</act_name>
<act_id>![CDATA[act_id]]</act_id>
<remark>![CDATA[新年紅包]]</remark>
<logo_imgurl>![CDATA[https://xx/img/wxpaylogo.png]]</logo_imgurl>
<share_content>![CDATA[share_content]]</share_content>
<share_url>![CDATA[https://xx/img/wxpaylogo.png]]</share_url>
<share_imgurl>![CDATA[https:/xx/img/wxpaylogo.png]]</share_imgurl>
<nonce_str>![CDATA[50780e0cca98c8c8e814883e5caa672e]]</nonce_str>
</xml>
*/
public function create_hongbao_xml($retcode = 0, $reterrmsg = "ok")
{
//var_dump($this->parameters);
//生成簽名
$this->setParameter('sign', $this->get_sign());
dump($this->parameters);
return $this->arrayToXml($this->parameters);
}
public function sendRedPacket($vars, $ssl = [], $second = 30, $aHeader = [])
{
$ch = curl_init();
//超時(shí)時(shí)間
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//這里設(shè)置代理璧针,如果有的話(huà)
//curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch, CURLOPT_URL, $this->red_packet_url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//以下兩種方式需選擇一種
//第一種方法大诸,cert 與 key 分別屬于兩個(gè).pem文件
if (array_key_exists("cert", $ssl) && array_key_exists('key', $ssl) && array_key_exists('rootca', $ssl)) {
curl_setopt($ch, CURLOPT_SSLCERT, $ssl['cert']);
curl_setopt($ch, CURLOPT_SSLKEY, $ssl['key']);
curl_setopt($ch, CURLOPT_CAINFO, $ssl['rootca']);
}
if (count($aHeader) >= 1) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
}
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
$data = curl_exec($ch);
if ($data) {
curl_close($ch);
$responseObj = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
return $responseObj;
} else {
$error = curl_errno($ch);
//echo "call faild, errorCode:$error\n";
curl_close($ch);
return false;
}
}
private function genAllUrl($toURL, $paras)
{
$allUrl = null;
if (null == $toURL) {
die("toURL is null");
}
if (strripos($toURL, "?") == "") {
$allUrl = $toURL . "?" . $paras;
} else {
$allUrl = $toURL . "&" . $paras;
}
return $allUrl;
}
private function splitParaStr($src, $token)
{
$resMap = array();
$items = explode($token, $src);
foreach ($items as $item) {
$paraAndValue = explode("=", $item);
if ($paraAndValue != "") {
$resMap[$paraAndValue[0]] = $parameterValue[1];
}
}
return $resMap;
}
private function formatQueryParaMap($paraMap, $urlencode)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if (null != $v && "null" != $v && "sign" != $k) {
if ($urlencode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
private function formatBizQueryParaMap($paraMap, $urlencode)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
// if (null != $v && "null" != $v && "sign" != $k) {
if ($urlencode) {
$v = urlencode($v);
}
$buff .= strtolower($k) . "=" . $v . "&";
//}
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
private function arrayToXml($arr)
{
$xml = "<xml>";
foreach ($arr as $key => $val) {
if (is_numeric($val)) {
$xml .= "<" . $key . ">" . $val . "</" . $key . ">";
} else
$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
}
$xml .= "</xml>";
return $xml;
}
}
調(diào)用方法 require or load,由于我的是多微信端管理避乏,所以定自行修改匹配代碼
$MCHID = "";
$money = 1 * 100;
$openid = "";
$config = ['partnerkey' => '', 'appid' => ''];
$redHelper = new WeChatReder($config);
$redHelper->setParameter("nonce_str", $redHelper->create_noncestr());//隨機(jī)字符串爷耀,丌長(zhǎng)于 32 位
$redHelper->setParameter("mch_billno", OrderHelper::createOrderNo());//訂單號(hào)
$redHelper->setParameter("mch_id", $MCHID);//商戶(hù)號(hào)
$redHelper->setParameter("wxappid", $config['appid']);
$redHelper->setParameter("nick_name", '騰訊');//提供方名稱(chēng)
$redHelper->setParameter("send_name", '騰訊');//紅包發(fā)送者名稱(chēng)
$redHelper->setParameter("re_openid", $openid);//相對(duì)于醫(yī)脈互通的openid
$redHelper->setParameter("total_amount", $money);//付款金額,單位分
$redHelper->setParameter("min_value", $money);//最小紅包金額拍皮,單位分
$redHelper->setParameter("max_value", $money);//最大紅包金額歹叮,單位分
$redHelper->setParameter("total_num", 1);//紅包収放總?cè)藬?shù)
$redHelper->setParameter("wishing", '感謝您參加搶紅包,祝您新年快樂(lè)铆帽!');//紅包祝福詫
$redHelper->setParameter("client_ip", '127.0.0.1');//調(diào)用接口的機(jī)器 Ip 地址
$redHelper->setParameter("act_name", "test");//活勱名稱(chēng)
$redHelper->setParameter("remark", '告訴你的朋友一起來(lái)?yè)尲t包吧');//備注信息
// $redHelper->setParameter("logo_imgurl", RES_DOMAIN.'assets/images/getheadimg.jpg');//商戶(hù)logo的url
// $redHelper->setParameter("share_content", '一起來(lái)?yè)孾騰訊]紅包吧');//分享文案
// $redHelper->setParameter("share_url", RES_DOMAIN);//分享鏈接
// $redHelper->setParameter("share_imgurl", RES_DOMAIN.'assets/images/getheadimg.jpg');//分享的圖片url
$postXml = $redHelper->create_hongbao_xml();
$weid = 1;
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
$ssl['cert'] = SSL_PATH . "{$weid}/apiclient_cert.pem";
$ssl['key'] = SSL_PATH . "{$weid}/apiclient_key.pem";
$ssl['rootca'] = SSL_PATH . "{$weid}/rootca.pem";
if (!file_exists($ssl['key'])) {
exit("證書(shū)不存在");
}
$rest = $redHelper->sendRedPacket($postXml, $ssl);
var_dump($rest);