当前位置: 移动技术网 > IT编程>开发语言>PHP > php实现微信支付之现金红包

php实现微信支付之现金红包

2018年08月10日  | 移动技术网IT编程  | 我要评论

网上的很多php微信支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入微信支付的带来些许帮助和借鉴意义。

直接运行该文件即可给指定的微信用户发送现金红包。

需要注意的事项:

1.微信现金红包要求必传证书,需要到这里 账户中心->账户设置->api安全->下载证书,然后修改代码中的证书路径

2.默认的使用场景是抽奖(即scene_id参数为product_2),额度是1-200元,所以测试时的最低金额是1元。如需修改在产品中心->产品大全->现金红包->产品设置中修改

3.该文件需放到支付授权目录下,可以在微信支付商户平台->产品中心->开发配置中设置。

4.如提示签名错误可以通过微信支付签名验证工具进行验证:

5.错误码参照 :

代码如下:

<?php
/**
 * 关于微信现金红包的说明
 * 1.微信现金红包要求必传证书,需要到https://pay.weixin.qq.com 账户中心->账户设置->api安全->下载证书,证书路径在第214行和217行修改
 * 2.默认的使用场景是抽奖(即scene_id参数为product_2),额度是1-200元,所以测试时的最低金额是1元。如需修改在产品中心->产品大全->现金红包->产品设置中修改
 * 3.错误码参照 :https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3
 */
header('content-type:text/html; charset=utf-8');
$mchid = 'xxxxx';  //微信支付商户号 partnerid 通过微信支付商户资料审核后邮件发送
$appid = 'xxxxx'; //微信支付申请对应的公众号的appid
$appkey = 'xxxxx'; //微信支付申请对应的公众号的app key
$apikey = 'xxxxx'; //https://pay.weixin.qq.com 帐户设置-安全设置-api安全-api密钥-设置api密钥

//①、获取当前访问页面的用户openid(如果给指定用户发送红包,则填写指定用户的openid)
$wxpay = new wxpayservice($mchid,$appid,$appkey,$apikey);
$openid = $wxpay->getopenid(); //获取openid
if(!$openid) exit('获取openid失败');
//②、发送红包
$outtradeno = uniqid(); //你自己的商品订单号
$payamount = 1;  //红包金额,单位:元
$sendname = '织梦猫'; //红包发送者名称
$wishing = '感谢您参加猜灯谜活动,祝您元宵节快乐!'; //红包祝福语
$act_name='猜灯谜抢红包活动';  //活动名称
$result = $wxpay->createjsbizpackage($openid,$payamount,$outtradeno,$sendname,$wishing,$act_name);
echo 'success';

class wxpayservice
{
 protected $mchid;
 protected $appid;
 protected $appkey;
 protected $apikey;
 public $data = null;

 public function __construct($mchid, $appid, $appkey,$key)
 {
 $this->mchid = $mchid;
 $this->appid = $appid;
 $this->appkey = $appkey;
 $this->apikey = $key;
 }

 /**
 * 通过跳转获取用户的openid,跳转流程如下:
 * 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
 * 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code
 * @return 用户的openid
 */
 public function getopenid()
 {
 //通过code获得openid
 if (!isset($_get['code'])){
  //触发微信返回code码
  $scheme = $_server['https']=='on' ? 'https://' : 'http://';
  $baseurl = urlencode($scheme.$_server['http_host'].$_server['php_self'].$_server['query_string']);
  $url = $this->__createoauthurlforcode($baseurl);
  header("location: $url");
  exit();
 } else {
  //获取code码,以获取openid
  $code = $_get['code'];
  $openid = $this->getopenidfrommp($code);
  return $openid;
 }
 }

 /**
 * 通过code从工作平台获取openid机器access_token
 * @param string $code 微信跳转回来带上的code
 * @return openid
 */
 public function getopenidfrommp($code)
 {
 $url = $this->__createoauthurlforopenid($code);
 $res = self::curlget($url);
 //取出openid
 $data = json_decode($res,true);
 $this->data = $data;
 $openid = $data['openid'];
 return $openid;
 }

 /**
 * 构造获取open和access_toke的url地址
 * @param string $code,微信跳转带回的code
 * @return 请求的url
 */
 private function __createoauthurlforopenid($code)
 {
 $urlobj["appid"] = $this->appid;
 $urlobj["secret"] = $this->appkey;
 $urlobj["code"] = $code;
 $urlobj["grant_type"] = "authorization_code";
 $bizstring = $this->tourlparams($urlobj);
 return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizstring;
 }

 /**
 * 构造获取code的url连接
 * @param string $redirecturl 微信服务器回跳的url,需要url编码
 * @return 返回构造好的url
 */
 private function __createoauthurlforcode($redirecturl)
 {
 $urlobj["appid"] = $this->appid;
 $urlobj["redirect_uri"] = "$redirecturl";
 $urlobj["response_type"] = "code";
 $urlobj["scope"] = "snsapi_base";
 $urlobj["state"] = "state"."#wechat_redirect";
 $bizstring = $this->tourlparams($urlobj);
 return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizstring;
 }

 /**
 * 拼接签名字符串
 * @param array $urlobj
 * @return 返回已经拼接好的字符串
 */
 private function tourlparams($urlobj)
 {
 $buff = "";
 foreach ($urlobj as $k => $v)
 {
  if($k != "sign") $buff .= $k . "=" . $v . "&";
 }
 $buff = trim($buff, "&");
 return $buff;
 }

 /**
 * 发送红包
 * @param string $openid 用户在该公众号下的openid
 * @param float $totalfee 红包金额 单位元
 * @param string $outtradeno 订单号
 * @param string $ordername 红包发送者名称
 * @param string $wishing 祝福语
 * @param string $actname 互动名称
 * @return string
 */
 public function createjsbizpackage($openid, $totalfee, $outtradeno, $sendname,$wishing,$actname)
 {
 $config = array(
  'mch_id' => $this->mchid,
  'appid' => $this->appid,
  'key' => $this->apikey,
 );
 $unified = array(
  'wxappid' => $config['appid'],
  'send_name' => $sendname,
  'mch_id' => $config['mch_id'],
  'nonce_str' => self::createnoncestr(),
  're_openid' => $openid,
  'mch_billno' => $outtradeno,
  'client_ip' => '127.0.0.1',
  'total_amount' => intval($totalfee * 100), //单位 转为分
  'total_num'=>1,   //红包发放总人数
  'wishing'=>$wishing,  //红包祝福语
  'act_name'=>$actname,  //活动名称
  'remark'=>'remark',  //备注信息,如为中文注意转为utf8编码
  'scene_id'=>'product_2', //发放红包使用场景,红包金额大于200时必传。https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3
 );
 $unified['sign'] = self::getsign($unified, $config['key']);
 $responsexml = $this->curlpost('https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack', self::arraytoxml($unified));
 $unifiedorder = simplexml_load_string($responsexml, 'simplexmlelement', libxml_nocdata);
 if ($unifiedorder === false) {
  die('parse xml error');
 }
 if ($unifiedorder->return_code != 'success') {
  die($unifiedorder->return_msg);
 }
 if ($unifiedorder->result_code != 'success') {
  die($unifiedorder->err_code);
 }
 return true;
 }

 public static function curlget($url = '', $options = array())
 {
 $ch = curl_init($url);
 curl_setopt($ch, curlopt_returntransfer, 1);
 curl_setopt($ch, curlopt_timeout, 30);
 if (!empty($options)) {
  curl_setopt_array($ch, $options);
 }
 //https请求 不验证证书和host
 curl_setopt($ch, curlopt_ssl_verifypeer, false);
 curl_setopt($ch, curlopt_ssl_verifyhost, false);
 $data = curl_exec($ch);
 curl_close($ch);
 return $data;
 }

 public function curlpost($url = '', $postdata = '', $options = array())
 {
 if (is_array($postdata)) {
  $postdata = http_build_query($postdata);
 }
 $ch = curl_init();
 curl_setopt($ch, curlopt_url, $url);
 curl_setopt($ch, curlopt_returntransfer, 1);
 curl_setopt($ch, curlopt_post, 1);
 curl_setopt($ch, curlopt_postfields, $postdata);
 curl_setopt($ch, curlopt_timeout, 30); //设置curl允许执行的最长秒数
 if (!empty($options)) {
  curl_setopt_array($ch, $options);
 }
 //https请求 不验证证书和host
 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().'/cert/apiclient_cert.pem');
 //默认格式为pem,可以注释
 curl_setopt($ch,curlopt_sslkeytype,'pem');
 curl_setopt($ch,curlopt_sslkey,getcwd().'/cert/apiclient_key.pem');
 //第二种方式,两个文件合成一个.pem文件
// curl_setopt($ch,curlopt_sslcert,getcwd().'/all.pem');
 $data = curl_exec($ch);
 curl_close($ch);
 return $data;
 }

 public static function createnoncestr($length = 16)
 {
 $chars = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789';
 $str = '';
 for ($i = 0; $i < $length; $i++) {
  $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
 }
 return $str;
 }
 public static 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;
 }

 public static function getsign($params, $key)
 {
 ksort($params, sort_string);
 $unsignparastring = self::formatqueryparamap($params, false);
 $signstr = strtoupper(md5($unsignparastring . "&key=" . $key));
 return $signstr;
 }
 protected static function formatqueryparamap($paramap, $urlencode = false)
 {
 $buff = "";
 ksort($paramap);
 foreach ($paramap as $k => $v) {
  if (null != $v && "null" != $v) {
  if ($urlencode) {
   $v = urlencode($v);
  }
  $buff .= $k . "=" . $v . "&";
  }
 }
 $reqpar = '';
 if (strlen($buff) > 0) {
  $reqpar = substr($buff, 0, strlen($buff) - 1);
 }
 return $reqpar;
 }
}
?>

github下载地址:weixinpay

相关文章:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网