PHP微信红包生成代码分享


Posted in PHP onOctober 06, 2016

本文实例为大家分享了PHP微信公众号自动发送红包API代码,分享给大家供大家参考。具体如下:

贴出核心接口代码至于数据自己填写,接口测试OK
wechat_packet.php

<!--?php
/**
 * 发送红包接口
 * Created by PhpStorm.
 * User: ADKi
 * Date: 2016/4/25 0025
 * Time: 15:25
 */

class wechat_packet{
 private $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';//请求URL
 private $mch_id;//商户号
 private $weixin_appid;//公众账号appid
 private $send_name;//商户名称
 private $total_num = 1;//发送红包总人数
 private $wishing;//红包祝福语
 private $client_ip;//调用接口的机器Ip地址
 private $act_name;//活动名称
 private $remark;//备注信息
 private $nonce_str;//随机字符串,不长于32位
 private $api_password;
 private $arraytoxml;//数组转xml
 /**
 * 公钥
 */
 private $public_key = "/api/wechat/cert/apiclient_cert.pem";
 /**
 * 私钥
 */
 private $private_key = '/api/wechat/cert/apiclient_key.pem';
 /**
 * ca证书
 */
 private $rootca = 'api/wechat/cert/rootca.pem';
 public function __construct()
 {
 //初始化红包设置信息
 $this--->weixin_appid = C('wap_weixin_appid');
 $this->mch_id = C('wechat_mch_id');
 $this->send_name = C('wechat_send_name');
 $this->wishing = C('wechat_wishing');
 $this->act_name = C('wechat_act_name');
 $this->client_ip = $_SERVER['SERVER_ADDR'];
 $this->remark = C('wechat_remark');
 $this->nonce_str = $this->create_nonce_str(32);
 $this->api_password = C('wechat_api_password');
 $inc_file = BASE_PATH.DS.'api'.DS.'wechat'.DS.'arraytoxml.php';
 if(is_file($inc_file)) {
 require($inc_file);
 }
 $this->arraytoxml = new ArrayToXML();
 }
 
 public function send_post($mch_billno,$re_openid,$total_amount){
 $sign = $this->create_sign($mch_billno,$re_openid,$total_amount);
 $send_array = array(
 'nonce_str' => $this->nonce_str,
 'mch_billno' => $mch_billno,
 'mch_id' => $this->mch_id,
 'wxappid' => $this->weixin_appid,
 'send_name' => $this->send_name,
 're_openid' => $re_openid,
 'total_amount' => $total_amount,
 'total_num' => $this->total_num,
 'wishing' => $this->wishing,
 'client_ip' => $this->client_ip,
 'act_name' => $this->act_name,
 'remark' => $this->remark,
 'sign' => $sign,
 );
 $send_xml = $this->arraytoxml->toXml($send_array,'');
 $data = $this->curl_post_ssl($this->url, $send_xml);
 $data = $this->xmlToArray($data);
 file_put_contents('adki',var_export($data,true),FILE_APPEND);
 }
 /*
 请确保您的libcurl版本是否支持双向认证,版本高于7.20.1
 */
 private 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_PROXY, '10.206.30.98');
 //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
 curl_setopt($ch,CURLOPT_URL,$url);
 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
 curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
 //以下两种方式需选择一种
 //第一种方法,cert 与 key 分别属于两个.pem文件
 //默认格式为PEM,可以注释
 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
 curl_setopt($ch,CURLOPT_SSLCERT,getcwd().$this->public_key);
 //默认格式为PEM,可以注释
 curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
 curl_setopt($ch,CURLOPT_SSLKEY,getcwd().$this->private_key);
 //ca证书
 curl_setopt($ch,CURLOPT_CAINFO,$this->rootca);
 //第二种方式,两个文件合成一个.pem文件
 //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.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);
 echo "call faild, errorCode:$error\n\n\n\n";
 curl_close($ch);
 return false;
 }
 }
 //生成签名
 private function create_sign($mch_billno,$re_openid,$total_amount){
 $string_array = array(
 'act_name' => $this->act_name,
 'client_ip' => $this->client_ip,
 'mch_billno' => $mch_billno,
 'mch_id' => $this->mch_id,
 'nonce_str' => $this->nonce_str,
 're_openid' => $re_openid,
 'remark' => $this->remark,
 'send_name' => $this->send_name,
 'total_amount' => $total_amount,
 'total_num' => $this->total_num,
 'wishing' => $this->wishing,
 'wxappid' => $this->weixin_appid,
 );
 foreach ($string_array as $key => $value){

 if(!empty($value)){

 $stringA .= "$key=$value";
 if($key != 'wxappid'){

  $stringA .= '&';
 }
 }
 }
 //转成UTF-8
 $stringA = $this->gbkToUtf8($stringA);
 $stringSignTemp="$stringA&key=$this->api_password";
 $sign = MD5($stringSignTemp);

 $sign = strtoupper($sign);
 return $sign;
 }
 //生成随机字符串
 private function create_nonce_str($length){
 $str = null;
 $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
 $max = strlen($strPol)-1;
 for($i=0;$i<$length;$i++){
 $str.=$strPol[rand(0,$max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
 }

 return $str;
 }
 /**
 *自动判断把gbk或gb2312编码的字符串转为utf8
 *能自动判断输入字符串的编码类,如果本身是utf-8就不用转换,否则就转换为utf-8的字符串
 *支持的字符编码类型是:utf-8,gbk,gb2312
 *@$str:string 字符串
 */
 private function gbkToUtf8($str){
 $charset = mb_detect_encoding($str,array('ASCII','UTF-8','GBK','GB2312'));
 $charset = strtolower($charset);
 if("utf-8" != $charset){
 $str = iconv('UTF-8',$charset,$str);
 }
 return $str;

 }
 private function xmlToArray($postStr){
 $msg = array();
 $msg = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
 return $msg;
 }
}

数组转xml:arraytoxml.php

<!--?php
/**
 * Created by PhpStorm.
 * User: ADKi
 * Date: 2016/4/26 0026
 * Time: 12:19
 */
class ArrayToXML
{
 public function toXml($data){
 $xml = '<xml-->';
 foreach ($data as $key => $value){
 if (is_numeric($value)){
 $xml .= "<".$key.">".$value."<!--".$key."-->";
 }else{
 $xml .= "<".$key."><!--[CDATA[".$value."]]--><!--".$key."-->";
 }
 }
 $xml .= '';
 return $xml;
 }

}

重写了一下PHP下面的微信API接口,

微信红包支持,JSAPI的动态参数接口支持

http://git.oschina.net/youkuiyuan/yky_test/blob/master/class/wxapi.class.php

微信API类 - 增加红包支持

<?php
 /********************************************************
 * @author Kyler You <QQ:2444756311>
 * @link http://mp.weixin.qq.com/wiki/home/index.html
 * @version 2.0.1
 * @uses $wxApi = new WxApi();
 * @package 微信API接口 陆续会继续进行更新
 ********************************************************/
 
 class WxApi {
 const appId  = "";
 const appSecret = ""; 
 const mchid  = ""; //商户号
 const privatekey = ""; //私钥
 public $parameters = array();
 
 public function __construct(){
 
 }
 
 /****************************************************
  * 微信提交API方法,返回微信指定JSON
  ****************************************************/
 
 public function wxHttpsRequest($url,$data = null){
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  if (!empty($data)){
   curl_setopt($curl, CURLOPT_POST, 1);
   curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  }
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  $output = curl_exec($curl);
  curl_close($curl);
  return $output;
 }
 
 /****************************************************
  * 微信带证书提交数据 - 微信红包使用
  ****************************************************/
 
 public function wxHttpsRequestPem($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_PROXY, '10.206.30.98');
  //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
  curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
 
  //以下两种方式需选择一种
 
  //第一种方法,cert 与 key 分别属于两个.pem文件
  //默认格式为PEM,可以注释
  curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
  curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/apiclient_cert.pem');
  //默认格式为PEM,可以注释
  curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
  curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/apiclient_key.pem');
 
  curl_setopt($ch,CURLOPT_CAINFO,'PEM');
  curl_setopt($ch,CURLOPT_CAINFO,getcwd().'/rootca.pem');
 
  //第二种方式,两个文件合成一个.pem文件
  //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.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);
   echo "call faild, errorCode:$error\n"; 
   curl_close($ch);
   return false;
  }
 }
 
 /****************************************************
  * 微信获取AccessToken 返回指定微信公众号的at信息
  ****************************************************/
 
 public function wxAccessToken($appId = NULL , $appSecret = NULL){
  $appId  = is_null($appId) ? self::appId : $appId;
  $appSecret = is_null($appSecret) ? self::appSecret : $appSecret;
  //echo $appId,$appSecret;
  $url  = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$appSecret;
  $result  = $this->wxHttpsRequest($url);
  //print_r($result);
  $jsoninfo = json_decode($result, true);
  $access_token = $jsoninfo["access_token"];
  return $access_token;
 }
 
 /****************************************************
  * 微信通过OPENID获取用户信息,返回数组
  ****************************************************/
 
 public function wxGetUser($openId){
  $wxAccessToken = $this->wxAccessToken();
  $url  = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$wxAccessToken."&openid=".$openId."&lang=zh_CN";
  $result  = $this->wxHttpsRequest($url);
  $jsoninfo = json_decode($result, true);
  return $jsoninfo;
 }
 
 /****************************************************
  * 微信通过指定模板信息发送给指定用户,发送完成后返回指定JSON数据
  ****************************************************/
 
 public function wxSendTemplate($jsonData){
  $wxAccessToken = $this->wxAccessToken();
  $url  = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$wxAccessToken;
  $result  = $this->wxHttpsRequest($url,$jsonData);
  return $result;
 }
 
 /****************************************************
  * 发送自定义的模板消息
  ****************************************************/
 
 public function wxSetSend($touser, $template_id, $url, $data, $topcolor = '#7B68EE'){
  $template = array(
   'touser' => $touser,
   'template_id' => $template_id,
   'url' => $url,
   'topcolor' => $topcolor,
   'data' => $data
  );
  $jsonData = json_encode($template);
  $result = $this->wxSendTemplate($jsonData);
  return $result;
 }
 
 /****************************************************
  * 微信设置OAUTH跳转URL,返回字符串信息 - SCOPE = snsapi_base //验证时不返回确认页面,只能获取OPENID
  ****************************************************/
 
 public function wxOauthBase($redirectUrl,$state = "",$appId = NULL){
  $appId  = is_null($appId) ? self::appId : $appId;
  $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appId."&redirect_uri=".$redirectUrl."&response_type=code&scope=snsapi_base&state=".$state."#wechat_redirect";
  return $url;
 }
 
 /****************************************************
  * 微信设置OAUTH跳转URL,返回字符串信息 - SCOPE = snsapi_userinfo //获取用户完整信息
  ****************************************************/
 
 public function wxOauthUserinfo($redirectUrl,$state = "",$appId = NULL){
  $appId  = is_null($appId) ? self::appId : $appId;
  $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appId."&redirect_uri=".$redirectUrl."&response_type=code&scope=snsapi_userinfo&state=".$state."#wechat_redirect";
  return $url;
 }
 
 /****************************************************
  * 微信OAUTH跳转指定URL
  ****************************************************/
 
 public function wxHeader($url){
  header("location:".$url);
 }
 
 /****************************************************
  * 微信通过OAUTH返回页面中获取AT信息
  ****************************************************/
 
 public function wxOauthAccessToken($code,$appId = NULL , $appSecret = NULL){
  $appId  = is_null($appId) ? self::appId : $appId;
  $appSecret = is_null($appSecret) ? self::appSecret : $appSecret;
  $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appId."&secret=".$appSecret."&code=".$code."&grant_type=authorization_code";
  $result  = $this->wxHttpsRequest($url);
  //print_r($result);
  $jsoninfo = json_decode($result, true);
  //$access_token = $jsoninfo["access_token"];
  return $jsoninfo;  
 }
 
 /****************************************************
  * 微信通过OAUTH的Access_Token的信息获取当前用户信息 // 只执行在snsapi_userinfo模式运行
  ****************************************************/
 
 public function wxOauthUser($OauthAT,$openId){
  $url  = "https://api.weixin.qq.com/sns/userinfo?access_token=".$OauthAT."&openid=".$openId."&lang=zh_CN";
  $result  = $this->wxHttpsRequest($url);
  $jsoninfo = json_decode($result, true);
  return $jsoninfo;  
 }
  
 /*****************************************************
  * 生成随机字符串 - 最长为32位字符串
  *****************************************************/
 public function wxNonceStr($length = 16, $type = FALSE) {
  $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  $str = "";
  for ($i = 0; $i < $length; $i++) {
  $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
  }
  if($type == TRUE){
  return strtoupper(md5(time() . $str));
  }
  else {
  return $str;
  }
 }
  
 /*******************************************************
  * 微信商户订单号 - 最长28位字符串
  *******************************************************/
  
 public function wxMchBillno($mchid = NULL) {
  if(is_null($mchid)){
  if(self::mchid == "" || is_null(self::mchid)){
   $mchid = time();
  }
  else{
   $mchid = self::mchid;
  }
  }
  else{
  $mchid = substr(addslashes($mchid),0,10);
  }
  return date("Ymd",time()).time().$mchid;
 }
  
 /*******************************************************
  * 微信格式化数组变成参数格式 - 支持url加密
  *******************************************************/ 
  
 public function wxSetParam($parameters){
  if(is_array($parameters) && !empty($parameters)){
  $this->parameters = $parameters;
  return $this->parameters;
  }
  else{
  return array();
  }
 }
  
 /*******************************************************
  * 微信格式化数组变成参数格式 - 支持url加密
  *******************************************************/
  
 public function wxFormatArray($parameters = NULL, $urlencode = FALSE){
  if(is_null($parameters)){
  $parameters = $this->parameters;
  }
  $restr = "";//初始化空
  ksort($parameters);//排序参数
  foreach ($parameters as $k => $v){//循环定制参数
  if (null != $v && "null" != $v && "sign" != $k) {
   if($urlencode){//如果参数需要增加URL加密就增加,不需要则不需要
   $v = urlencode($v);
   }
   $restr .= $k . "=" . $v . "&";//返回完整字符串
  }
  }
  if (strlen($restr) > 0) {//如果存在数据则将最后“&”删除
  $restr = substr($restr, 0, strlen($restr)-1);
  }
  return $restr;//返回字符串
 }
  
 /*******************************************************
  * 微信MD5签名生成器 - 需要将参数数组转化成为字符串[wxFormatArray方法]
  *******************************************************/
 public function wxMd5Sign($content, $privatekey){
 try {
  if (is_null($key)) {
   throw new Exception("财付通签名key不能为空!");
  }
  if (is_null($content)) {
   throw new Exception("财付通签名内容不能为空");
  }
  $signStr = $content . "&key=" . $key;
  return strtoupper(md5($signStr));
  }
  catch (Exception $e)
  {
  die($e->getMessage());
  }
 }
  
 /*******************************************************
  * 微信Sha1签名生成器 - 需要将参数数组转化成为字符串[wxFormatArray方法]
  *******************************************************/
 public function wxSha1Sign($content, $privatekey){
 try {
  if (is_null($key)) {
   throw new Exception("财付通签名key不能为空!");
  }
  if (is_null($content)) {
   throw new Exception("财付通签名内容不能为空");
  }
  $signStr = $content . "&key=" . $key;
  return strtoupper(sha1($signStr));
  }
  catch (Exception $e)
  {
  die($e->getMessage());
  }
 }
 
 /*******************************************************
  * 将数组解析XML - 微信红包接口
  *******************************************************/
  
 public function wxArrayToXml($parameters = NULL){
  if(is_null($parameters)){
  $parameters = $this->parameters;
  }
  
  if(!is_array($parameters) || empty($parameters)){
  die("参数不为数组无法解析");
  }
  
  $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; 
 }
  
 }

后期还是会增加在一起的把这个CLASS做起来,网上资源很多,但是都是有一定基础的人去看看改改可以,对于没有接触刚刚接触的新手还是需要给予支持的。帮助用户屡屡思路。

再来一份:

首先给大家看一看这个表格:

PHP微信红包生成代码分享

根据微信高级红包接口,开发PHP版本的API接口,现在进行主要代码分析。

红包接口调用请求代码,所有请求参数为必填参数与文档对应:

class Wxapi {
 private $app_id = 'wxXXXXXXXXXXXX'; //公众账号appid,首先申请与之配套的公众账号
 private $app_secret = 'XXXXXXXXXXXXXXXXXXXXXXXX';//公众号secret,用户获取用户授权token
 private $app_mchid = 'XXXXXXXX';//商户号id
 function __construct(){
 //do sth here....
 }
 /**
 * 微信支付
 * @param string $openid 用户openid
 */
 public function pay($re_openid)
 {
 include_once('WxHongBaoHelper.php');
 $commonUtil = new CommonUtil();
 $wxHongBaoHelper = new WxHongBaoHelper();
 $wxHongBaoHelper->setParameter("nonce_str", $this->great_rand());//随机字符串,丌长于 32 位
 $wxHongBaoHelper->setParameter("mch_billno", $this->app_mchid.date('YmdHis').rand(1000, 9999));//订单号
 $wxHongBaoHelper->setParameter("mch_id", $this->app_mchid);//商户号
 $wxHongBaoHelper->setParameter("wxappid", $this->app_id);
 $wxHongBaoHelper->setParameter("nick_name", '红包');//提供方名称
 $wxHongBaoHelper->setParameter("send_name", '红包');//红包发送者名称
 $wxHongBaoHelper->setParameter("re_openid", $re_openid);//相对于医脉互通的openid
 $wxHongBaoHelper->setParameter("total_amount", 100);//付款金额,单位分
 $wxHongBaoHelper->setParameter("min_value", 100);//最小红包金额,单位分
 $wxHongBaoHelper->setParameter("max_value", 100);//最大红包金额,单位分
 $wxHongBaoHelper->setParameter("total_num", 1);//红包?Х抛苋耸
 $wxHongBaoHelper->setParameter("wishing", '感谢您参与红包派发活动,祝您新年快乐!');//红包祝福诧
 $wxHongBaoHelper->setParameter("client_ip", '127.0.0.1');//调用接口的机器 Ip 地址
 $wxHongBaoHelper->setParameter("act_name", '红包活动');//活劢名称
 $wxHongBaoHelper->setParameter("remark", '快来抢!');//备注信息
 $postXml = $wxHongBaoHelper->create_hongbao_xml();
 $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
 $responseXml = $wxHongBaoHelper->curl_post_ssl($url, $postXml);
 //用作结果调试输出
 //echo htmlentities($responseXml,ENT_COMPAT,'UTF-8');
 $responseObj = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
 return $responseObj->return_code;
 }

获取随机字符串方法:

/**
 * 生成随机数
 */ 
public function great_rand(){
 $str = '1234567890abcdefghijklmnopqrstuvwxyz';
 for($i=0;$i<30;$i++){
 $j=rand(0,35);
 $t1 .= $str[$j];
 }
 return $t1; 
}

签名算法:

/**
例如:
appid: wxd111665abv58f4f
mch_id: 10000100
device_info: 1000
Body: test
nonce_str: ibuaiVcKdpRxkhJA
第一步:对参数按照 key=value 的格式,并按照参数名 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(){
 define('PARTNERKEY',"QSRXXXXXXXXXXXXXXXXXXXXX");
 try {
 if (null == PARTNERKEY || "" == PARTNERKEY ) {
 throw new SDKRuntimeException("密钥不能为空!" . "<br>");
 }
 if($this->check_sign_parameters() == false) { //检查生成签名参数
 throw new SDKRuntimeException("生成签名参数缺失!" . "<br>");
 }
 $commonUtil = new CommonUtil();
 ksort($this->parameters);
 $unSignParaString = $commonUtil->formatQueryParaMap($this->parameters, false);
 $md5SignUtil = new MD5SignUtil();
 return $md5SignUtil->sign($unSignParaString,$commonUtil->trimString(PARTNERKEY));
 }catch (SDKRuntimeException $e)
 {
 die($e->errorMessage());
 }
 
}

CURL请求以及发送证书:

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文件
 //请确保您的libcurl版本是否支持双向认证,版本高于7.20.1
 curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).DIRECTORY_SEPARATOR.'zhengshu'.DIRECTORY_SEPARATOR.'apiclient_cert.pem');
 curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).DIRECTORY_SEPARATOR.'zhengshu'.DIRECTORY_SEPARATOR.'apiclient_key.pem');
 curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).DIRECTORY_SEPARATOR.'zhengshu'.DIRECTORY_SEPARATOR.'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);
 //echo "call faild, errorCode:$error\n"; 
 curl_close($ch);
 return false;
 }
}

入口文件:

@require "pay.php";
//获取用户信息
$get = $_GET['param'];
$code = $_GET['code'];
//判断code是否存在
if($get=='access_token' && !empty($code)){
 $param['param'] = 'access_token';
 $param['code'] = $code;
 $packet = new Packet();
 //获取用户openid信息
 $userinfo = $packet->_route('userinfo',$param);
 if(empty($userinfo['openid'])){
 exit("NOAUTH");
 }
 //调取支付方法
 $packet->_route('wxpacket',array('openid'=>$userinfo['openid']));
}else{
 $packet->_route('userinfo');
}

以上就是本文的全部内容,希望对大家学习PHP程序设计有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
基于mysql的bbs设计(四)
Oct 09 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
May 12 PHP
php实现斐波那契数列的简单写法
Jul 19 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 PHP
php两种无限分类方法实例
Apr 21 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
Jul 01 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
Aug 12 PHP
基于win2003虚拟机中apache服务器的访问
Aug 01 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
Laravel框架中自定义模板指令总结
Dec 17 PHP
Linux系统下安装PHP7.3版本
Jun 26 PHP
PHP RabbitMQ消息列队
May 11 PHP
php下载文件超时时间的设置方法
Oct 06 #PHP
详谈php静态方法及普通方法的区别
Oct 04 #PHP
php操作路径的经典方法(必看篇)
Oct 04 #PHP
php将文件夹打包成zip文件的简单实现方法
Oct 04 #PHP
浅谈PHP中静态方法和非静态方法的相互调用
Oct 04 #PHP
PHP图片添加水印功能示例小结
Oct 03 #PHP
PHP通过CURL实现定时任务的图片抓取功能示例
Oct 03 #PHP
You might like
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
php-cli简介(不会Shell语言一样用Shell)
2013/06/03 PHP
PHP取二进制文件头快速判断文件类型的实现代码
2013/08/05 PHP
php中关于socket的系列函数总结
2015/05/18 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
jQuery实现跨域
2015/02/03 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
javascript连续赋值问题
2015/07/08 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
2016/11/18 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
python实现根据ip地址反向查找主机名称的方法
2015/04/29 Python
python 编写简单网页服务器的实例
2018/06/01 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
keras多显卡训练方式
2020/06/10 Python
Python实现自动装机功能案例分析
2020/10/22 Python
Python模拟登录requests.Session应用详解
2020/11/17 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
新春寄语大全
2014/04/09 职场文书
《最佳路径》教学反思
2014/04/13 职场文书
党员干部一句话承诺
2014/05/30 职场文书
硕士生找工作求职信
2014/07/05 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
2015年仓库工作总结
2015/04/09 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android