终于找到原因了,写微信开发文档的真是垃圾,需要去掉 CDATA 标记
string
nonce_str = Get_GuidStr();
//随机字符串
string
sign =
""
;
//签名
string
mch_id =
"100000000"
;
//商户号
string
mch_billno = Get_BillNo(mch_id);
//商户订单号
string
wxappid =
"wx8asdfderqweqweqwe2b"
;
//公众账号appid
string
nick_name =
"aa"
;
//提供方名称
string
send_name =
"aa"
;
//商户名称
string
re_openid =
"asdfasfwerqweqeqweqe"
;
//用户openid
int
total_amount = 100;
//付款金额(分)
int
min_value = 100;
//最小红包金额
int
max_value = 100;
//最大红包金额
int
total_num = 1;
//红包发放总人数
string
wishing =
"新年新气象,祝您身体健康,万事如意!"
;
//红包祝福语
string
client_ip =
"114.249.210.173"
;
//"221.5.252.231";//Ip地址
string
act_name =
"测试红包功能。"
;
//活动名称
string
remark =
"测的越多,送的越多。"
;
//备注
string
logo_imgurl =
""
;
//商户logo的url
string
share_content =
""
;
//分享文案
string
share_url =
""
;
//分享链接
string
share_imgurl =
""
;
//分享的图片
<?php
const
API =
\'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack\'
;
const
MCH_ID =
\'\'
;
const
MCH_SECRET =
\'\'
;
const
APP_KEY =
\'\'
;
const
APP_SECRET =
\'\'
;
const
OPENID =
\'\'
;
$money
= 100;
//------------------logic----------------------
$params
= [
\'mch_billno\'
=>gen_mch_billno(),
\'mch_id\'
=>MCH_ID,
\'wxappid\'
=>APP_KEY,
\'nick_name\'
=>
\'xxxxx\'
,
\'send_name\'
=>
\'xxxx\'
,
\'re_openid\'
=>OPENID,
\'total_amount\'
=>
$money
,
\'min_value\'
=>
$money
,
\'max_value\'
=>
$money
,
\'total_num\'
=>1,
\'wishing\'
=>
\'感谢您参加!\'
,
\'client_ip\'
=>
\'127.0.0.1\'
,
\'act_name\'
=>
\'测试红包\'
,
\'act_id\'
=>17481,
\'remark\'
=>
\'备注提示\'
,
\'logo_imgurl\'
=>
\'http://www.sogou.com/images/logo/new/sogou.png\'
,
\'share_url\'
=>
\'http://xxxx.com\'
,
\'share_imgurl\'
=>
\'http://www.sogou.com/images/logo/new/sogou.png\'
,
\'share_content\'
=>
\'恭喜发财\'
,
\'remark\'
=>
\'新年红包哦~\'
,
\'nonce_str\'
=>gen_nonce(),
];
$res
= post(API, gen_xml(
$params
), true);
var_dump(
$res
);
//-----------------func-----------------------
function
gen_xml(
$params
) {
$xml
=
\'<xml>\'
;
$fmt
=
\'<%s><![CDATA[%s]]></%s>\'
;
foreach
(
$params
as
$key
=>
$val
){
$xml
.=sprintf(
$fmt
,
$key
,
$val
,
$key
);
}
$xml
.=
\'</xml>\'
;
return
$xml
;
}
function
sign(
$params
){
ksort(
$params
);
$beSign
=
array_filter
(
$params
,
\'strlen\'
);
$pairs
=
array
();
foreach
(
$beSign
as
$k
=>
$v
) {
$pairs
[] =
"$k=$v"
;
}
$sign_data
= implode(
\'&\'
,
$pairs
);
$sign_data
.=
\'&key=\'
.MCH_SECRET;
return
strtoupper
(md5(
$sign_data
));
}
function
gen_nonce(){
return
md5(uniqid(
\'\'
, true));
}
function
gen_mch_billno(){
return
MCH_ID.
date
(
\'Ymd\'
).time();
}
function
post(
$url
,
$strXml
,
$CA
= true) {
//$arrHeader[] = \'Content-Length: \' . strlen($strXml);
$cacert
= __DIR__ .
\'/cacert.pem\'
;
//CA根证书
$SSL
=
substr
(
$url
, 0, 8) ==
"https://"
? true : false;
$ch
= curl_init();
curl_setopt(
$ch
, CURLOPT_URL,
$url
);
//curl_setopt($ch, CURLOPT_HTTPHEADER, $arrHeader);
if
(
$SSL
&&
$CA
) {
curl_setopt(
$ch
, CURLOPT_SSL_VERIFYPEER, true);
// 只信任CA颁布的证书
curl_setopt(
$ch
, CURLOPT_SSLCERT,__DIR__.
\'/apiclient_cert.pem\'
);
curl_setopt(
$ch
, CURLOPT_SSLKEY,__DIR__.
\'/apiclient_key.pem\'
);
curl_setopt(
$ch
, CURLOPT_CAINFO,
$cacert
);
// CA根证书(用来验证的网站证书是否是CA颁布)
curl_setopt(
$ch
, CURLOPT_SSL_VERIFYHOST, 2);
// 检查证书中是否设置域名,并且是否与提供的主机名匹配
}
else
if
(
$SSL
&& !
$CA
) {
curl_setopt(
$ch
, CURLOPT_SSL_VERIFYPEER, false);
// 信任任何证书
curl_setopt(
$ch
, CURLOPT_SSL_VERIFYHOST, 2);
// 检查证书中是否设置域名
}
curl_setopt(
$ch
, CURLOPT_POST, 1);
curl_setopt(
$ch
, CURLOPT_POSTFIELDS,
$strXml
);
curl_setopt(
$ch
, CURLOPT_RETURNTRANSFER, 1);
curl_setopt(
$ch
, CURLOPT_HEADER, 0);
$res
= curl_exec(
$ch
);
curl_close(
$ch
);
return
$res
;
}