微信的开发真的有点麻烦,不是难,就是烦,细节多,东西多,关联多
这里记录下 微信企业红包开发的整个过程(弄完的话 微信支付 也差不多了,代码是 php的)
- 申请:这里只说简单的过程
- 先申请公众服务号
- 在服务号中申请‘微信支付’(登录公众号平台首页左面有这个菜单),觉得微信在推广移动支付,所以还是很好申请的,关于申请中填写的网站最好做一个购买的演示链接,这样可能更容易下来。
- 证书
- 微信支付申请下来了,那么你有了一个 微信的 商户号和登录密码 (会发邮件给你)
- 还是从申请微信支付哪里 点到 微信商户登录页面
- 进去先看 [账户管理]设置证书 安装证书 设置证书的 api秘钥(这个是开发的签名key 自己保存好) 然后下载开发用的证书,反正都在这个大菜单里
- 下载了证书 放到一个安全点的目录(我是用php开发 linux环境,和window可能有点小区别) 注意这个目录不要是 web服务的目录 不然被别人下载了 呵呵。。
- 开发代码整理
- 老规矩直接找别人的代码,找到一个看起来靠谱的,尼玛 6个文件。。。说真的 看demo的时候 我特别讨厌 封装
- 下面是我自己整理的代码,实际测试ok的时间 不足整理时间的 十分之一 再次无语(不过还是要谢谢 放代码的兄弟)
- 注意 所有方法全要 放一个php 类里就可以了 GrantHongbao是入口方法 下面的参数自己换一下
- 注意 证书目录 替换成你 保存证书的目录
-
</pre></li></ul></ol></p><pre name="code" class="plain">
public function GrantHongbao(){ //发送红包
$PARTNERKEY = C(‘WEIXINPAYAPIKEY‘); //商户的签名加密key
$APPMCHID = C(‘WEIXINMCHID‘); //微信商户号
$WEIXINAPPID = C(‘WEIXINAPPID‘); //微信的appid
$BILLNO = $this->app_mchid.date(‘YmdHis‘).rand(1000, 9999); //订单号
$openid = C(‘KKOPENID‘); //收红包的人的openid
$acount = 100; //发放的金额(单位分)
$url = ‘https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack‘; //api url
$ip = ‘101.45.174.67‘; //本机ip
$parames = array();
$parames["nonce_str"] = $this->great_rand();//随机字符串,丌长于 32 位
$parames["mch_billno"] = $BILLNO;//订单号
$parames["mch_id"] = $APPMCHID;//商户号
$parames["wxappid"] = $WEIXINAPPID;
$parames["nick_name"] = ‘红包nick_name‘;//提供方名称
$parames["send_name"] = ‘KK‘;//红包发送者名称
$parames["re_openid"] = $openid;//openid
$parames["total_amount"] = $acount;//付款金额,单位分
$parames["min_value"] = $acount;//最小红包金额,单位分
$parames["max_value"] = $acount;//最大红包金额,单位分
$parames["total_num"] = 1;//红包収放总人数
$parames["wishing"] = ‘发个红包真不容易...‘;//红包祝福
$parames["client_ip"] = $ip;//调用接口的机器 Ip 地址
$parames["act_name"] = ‘kk测试红包‘;//活劢名称
$parames["remark"] = ‘快来抢!(没了别来了)‘;//
$parames["sign"] = $this->get_sign($parames, $PARTNERKEY);//参数签名
//var_dump($parames);
//转成xml字符串
$postXml = $this->array2Xmlstring($parames);
//echo ‘<br>‘;
//var_dump($postXml);
//向微信老大发起请求
$responseXml = $this->curl_post_ssl($url, $postXml);
//echo ‘<br>$responseXml<br>‘;
var_dump($responseXml);
$responseObj = simplexml_load_string($responseXml, ‘SimpleXMLElement‘, LIBXML_NOCDATA);
echo $responseObj->return_code;
}
/**
*获取参数列表的签名
* @param type $parameters
* @param type $PARTNERKEY:签名的秘钥
* @return type
*/
protected function get_sign($parameters, $PARTNERKEY){
//字典排序
ksort($parameters);
$unSignParaString = $this->formatQueryParaMap($parameters, false);
//要签名的字符串
$signStr = $unSignParaString . "&key=" . $PARTNERKEY;
return strtoupper(md5($signStr));
}
/**
*将参数列表转化为连接字符串
* @param type $paraMap
* @param type $urlencode
* @return type
*/
protected function formatQueryParaMap($paraMap, $urlencode){
$buff = "";
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;
}
/**
*生成随机数(默认30位长度)
* @return string
*/
protected function great_rand($length = 30){
$str = ‘1234567890abcdefghijklmnopqrstuvwxyz‘;
for($i=0;$i<$length;$i++){
$j=rand(0,35);
$t1 .= $str[$j];
}
return $t1;
}
/**
*数组转xml串
* @param type $arr
* @return string
*/
protected function array2Xmlstring($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;
}
/**
* 访问微信接口
* @param type $url
* @param type $vars
* @param type $second
* @param type $aHeader
* @return boolean
*/
protected function curl_post_ssl($url, $vars, $second=30,$aHeader=array()){
$ch = curl_init();
//超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
//这里设置代理,如果有的话
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
//cert 与 key 分别属于两个.pem文件
curl_setopt($ch,CURLOPT_SSLCERT,‘证书保存路径‘.‘apiclient_cert.pem‘);
curl_setopt($ch,CURLOPT_SSLKEY,‘证书保存路径‘.‘apiclient_key.pem‘);
curl_setopt($ch,CURLOPT_CAINFO,‘证书保存路径‘.‘rootca.pem‘);
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);
return $data;
}
else {
$error = curl_errno($ch);
curl_close($ch);
return $error;
}
}