上一篇文章介绍了《
微信服务号二次开发:服务器配置(http://www.zongk.com/zongk/128.html)》,今天这篇文章记录《微信服务号二次开发:现金红包》接口接入。
想要获得现金红包接口权限,现在需要条件:
1、微信服务号
2、实名认证
才可以继续申请“微信支付接口”使用权限,这里具体怎么申请?根据官方流程走就好了,不详细介绍了。
进入正题:
《微信服务号二次开发:现金红包》接口(以下简称微信现金红包接口)的接入主要涉及两个点:
1、签名(sign)的生成
2、如何使用“API证书”
以下做分解:
1、签名算法sign生成:
官方文档中提到:
----------------------------------
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
◆ key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
----------------------------------
先说说一个“小坑”:
我们现将官方“请求字段”建立一个数组,数组拼接时,如果有中文,不要用“http_build_query”直接生成字符串,之前一直有中文,转换成sign请求一直不成功,我这里用了foreach组合方式拼接,成功(有更好的方案,求分享)
具体代码:
----------------------------------
ksort($datack);//数组排序
$datastr = '';
$jg = '';
foreach($datack as $key=>$v){
$datastr .= $jg.$key.'='.$v;
$jg = '&';
}//以上是数组拼接
$vstr = $datastr.'&key='.$apimiyao;
//拼接API秘钥
$signvalue = strtoupper(md5($vstr));
//得到MD5后的值,并且小写转成大写
-----------------------------------------
2、如何使用API证书
发送POST请求一直使用的是curl
下面贴上所有POST请求的curl设置:
---------------------------------------
$capath = $_SERVER['DOCUMENT_ROOT'].'/zs';
$capathname = $_SERVER['DOCUMENT_ROOT'].'/zs/apiclient_cert.pem';
$cpkey = $_SERVER['DOCUMENT_ROOT'].'/zs/apiclient_key.pem';
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);//设置curl可以请求HTTPS
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);//设置curl可以请求HTTPS
curl_setopt($ch,CURLOPT_POST,true);//设置POST请求
curl_setopt($ch,CURLOPT_POSTFIELDS,$poststr);//设置POST请求的数据
curl_setopt($ch,CURLOPT_SSLCERT,$capathname);//这里设置API证书的PEM证书
curl_setopt($ch,CURLOPT_SSLKEY, $cpkey);//这里设置API证书的PEM证书的KEY
curl_setopt($ch,CURLOPT_SSLKEYPASSWD,'微信商户号(mch_id)');//这里设置在 CURLOPT_SSLKEY 中指定了的SSL私钥的密码
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);
$res = curl_exec($ch);
var_dump(curl_error($ch));
curl_close($ch);
var_dump($res);
---------------------------------------
这里是请求数据内容样例:
---------------------------------------
<xml>
<sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>
<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>
<mch_id><![CDATA[888]]></mch_id>
<wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>
<send_name><![CDATA[send_name]]></send_name>
<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>
<total_amount><![CDATA[200]]></total_amount>
<total_num><![CDATA[1]]></total_num>
<wishing><![CDATA[恭喜发财]]></wishing>
<client_ip><![CDATA[127.0.0.1]]></client_ip>
<act_name><![CDATA[新年红包]]></act_name>
<remark><![CDATA[新年红包]]></remark>
<scene_id><![CDATA[PRODUCT_2]]></scene_id>
<consume_mch_id><![CDATA[10000097]]></consume_mch_id>
<nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str>
<risk_info>posttime%3d123123412%26clientversion%3d234134%26mobile%3d122344545%26deviceid%3dIOS</risk_info>
</xml>
---------------------------------------
调用接口实际效果如下图:
TAGS:微信 , 二次开发 , 现金红包
来自Davids zhou博客原创文章请尊重作者:http://www.zongk.com/zongk/129.html转载请标注此链接