• 一、前言
    • 1、大概思路
    • 2、注意
    • 3、特别注意
  • 二、代码
  • 三、结果打印
    • 打印截图
    • 如果校验了证书,但是证书地址错误,则报错如下:

一、前言

1、大概思路

  • 1、查找官方文档:百度搜索微信现金红包接口,找到页面 微信支付 - 现金红包 - 产品说明
  • 2、根据文档接口,组装请求参数:微信支付 - 现金红包 - 发放红包接口
  • 3、使用参数去请求接口,处理接口返回的数据:微信支付 - 现金红包 - 安全规范

2、注意

  • 注意:这篇文章只是针对单个接口,编写PHP的实现方法。而不是从零教你怎么把微信接口相关数据JDK证书... 整合到我们的项目中。
  • 这里为了演示,把自定义的处理数据方法都写到Test.php中了,实际中,请把这些公共方法,放到extend下的Wechat\WechatPay.php中,WechatPay.php为自定义的文件
  • 他山之石:微信小程序PHP 微信支付接口调用

3、特别注意

  • 接口请求参数 total_amount的单位是
  • 微信接口可能会变动,可能会致使以下PHP代码失效,请以最新的官方文档为准

二、代码

  • Test.php
<?php
namespace app\index\controller;use think\Exception;
use think\facade\Env;class Test {public function __construct() {//header('Access-Control-Allow-Origin:*');    //支持跨域请求}/*** 入口方法* @throws Exception*/public function reward() {$money = 1; //奖励红包金额:单位-元$openid = 'sadfsadfsd'; //用户的openidlist($requestString, $responseString, $message) = self::sendMoney($money, $openid);if ($message) {echo <<<EOF
【请求数据】<br/>
{$requestString}<br/><br/>【响应数据】<br/>
{$responseString}<br/><br/>【错误提示】<br/>
{$message}
EOF;} else {echo "操作成功~";}}/*** 微信发放红包接口文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3* 组装数据,调用微信接口(请注意:这里的参数请根据自己的实际情况来改动,我这里写的是个Demo,仅供参考~)* @param $money 红包金额:单位-元 (微信接口的金额单位为:分,这里要注意一下)* @param $openid 用户的openid* @return array 结果数据* @throws Exception 抛出异常*/public function sendMoney($money, $openid) {$amount = $money * 100; //红包金额:需要转成微信需要的单位-分//组装接口请求数据:就按照文档的参数顺序来$params = ['nonce_str' => self::getRandStr(), //随机字符串,不长于32位//'sign' => '', //签名'mch_billno' => self::getUniqidStr(), //商户订单号(每个订单号必须唯一。取值范围:0~9,a~z,A~Z)'mch_id' => '100***98', //商户号-微信支付分配的商户号'wxappid' => 'wx8888888888888888', //公众账号appid-微信分配的公众账号ID(企业号corpid即为此appId)。在微信开放平台(open.weixin.qq.com)申请的移动应用appid无法使用该接口。'send_name' => '商户名称', //商户名称-红包发送者名称(注意:敏感词会被转义成字符*)'re_openid' => $openid, //用户openid-接受红包的用户openid'total_amount' => $amount, //付款金额:单位-分'total_num' => 1, //红包发放总人数:total_num=1'wishing' => '感谢您参加活动,祝您生活愉快!', //红包祝福语(注意:敏感词会被转义成字符*)'client_ip' => $_SERVER['SERVER_ADDR'], //Ip地址-调用接口的机器Ip地址'act_name' => "促销节", //活动名称(注意:敏感词会被转义成字符*)'remark' => "参加活动【促销节】,平台奖励红包", //备注-备注信息//'scene_id' => 0, //场景id-否: 红包金额大于200或者小于1元时,请求参数scene_id必传,参数说明见下文。//'risk_info' => 0, //活动信息-否  在数据示例中,这个参数是没有 <![CDATA[]] 的,需要注意一下];//发放红包使用场景,红包金额大于200或者小于1元时必传:PRODUCT_1:商品促销,PRODUCT_2:抽奖,PRODUCT_3:虚拟物品兑奖,PRODUCT_4:企业内部福利,PRODUCT_5:渠道分润,PRODUCT_6:保险回馈,PRODUCT_7:彩票派奖,PRODUCT_8:税务刮奖,if (($money < 1) || ($money > 200)) {$params['scene_id'] = 'PRODUCT_1';}//签名生成$params['sign'] = self::getSign($params, '21b3*******943');//请求接口$message = '';$xml = self::arrayToXml($params);$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack'; //微信发放红包API地址$response = self::curlPostXml($xml, $url, true);$responseRet = self::xmlToArray($response);if ($responseRet['result_code'] == 'FAIL') {$message = !empty($responseRet['err_code_des']) ? $responseRet['err_code_des'] : '接口异常';}//我这里记录一下接口的(请求数据、返回数据):各位可以把这个数据存文件或者存数据表,用于上线后问题排查$requestString = json_encode($params, JSON_UNESCAPED_UNICODE);$responseString = json_encode($responseRet, JSON_UNESCAPED_UNICODE);return [$requestString, $responseString, $message];}/*** post方式传xml数据请求接口* 由于curl_setopt设置实在是太多了:这个方法中可能不是很完善,大家实际运用中发现了问题再添加curl_setopt相关设置* @param $xml 请求的XML数据* @param $url 请求的地址* @param bool $certCheck 是否需要证书校验:false-否; true-是* @param array $header 请求头设置* @param int $second 超时时间设置(默认30秒)* @return bool|string 返回的结果数据* @throws Exception 接口请求异常提示*/public function curlPostXml($xml, $url, $certCheck = false, $header = [], $second = 30) {//开启句柄$ch = curl_init();//超时时间curl_setopt($ch,CURLOPT_TIMEOUT,$second);curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);//这里设置代理,如果有的话//curl_setopt($ch,CURLOPT_PROXY, '11.***.**.11');//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);//是否传入证书//apiclient_cert.p12是商户证书文件,除PHP外的开发均使用此证书文件。//咱们PHP使用这两个证书哈:apiclient_cert.pem apiclient_key.pem//微信支付证书文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3if ($certCheck) {//请注意:这2个文件隐私性是极高的,我们linux中应该设置这2个文件夹权限为只读,不能修改,也不能下载。curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); //默认格式为PEM,可以注释//绝对地址可使用 dirname(__DIR__)打印,如果不是绝对地址会报 58 错误curl_setopt($ch,CURLOPT_SSLCERT, Env::get('extend_path') .'Wechat/cert/apiclient_cert.pem');curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');curl_setopt($ch,CURLOPT_SSLKEY, Env::get('extend_path') .'Wechat/cert/apiclient_key.pem');}//设置请求头if ($header) {curl_setopt($ch, CURLOPT_HTTPHEADER, $header);}curl_setopt($ch,CURLOPT_POST, 1); //POST请求:第二个值可以传int类型的:1,也可以传bool类型的:truecurl_setopt($ch,CURLOPT_POSTFIELDS, $xml);$data = curl_exec($ch); //去请求接口if ($data) {curl_close($ch); //关闭句柄return $data;} else {$error = curl_errno($ch); //获取错误码curl_close($ch); //关闭句柄throw new Exception("请求异常, errorCode:{$error}"); //如果证书地址错误,可能会报58错误}}/*** 根据微信的规则,计算出sign参数的值* @param $array 待处理的参数* @param $key 秘钥* @return string 结果数据*/public function getSign($array, $key) {//1、把数组按照键值升序ksort($array);//2、数组数据拼接成 a=1&b=2&c=3 形式$string = self::getUrlParam($array);//3、在string后加入key参数$string = $string . "&key=" . $key;//4、md5加密$string = md5($string);//5、字符串转为大写并返回return strtoupper($string);}/*** 格式化参数为url参数:把数组数据处理成:a=1&b=2&c=3格式* @param $array 待处理的参保时* @return string 处理完的参数*/public function getUrlParam($array) {$string = "";foreach ($array as $key => $value) {if ($value && !is_array($value) && ($key != 'sign')) { //值存在并且不是数组;并且键名不为sign$string .= "{$key}={$value}&";}}if ($string) { //去除最右边的特殊字符&$string = rtrim($string, '&');}return $string;}/*** 创建随机字符串* @param $length* @return string*/public function getRandStr($length = 16) {$string = "";$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; //随机字符for ($i = 0; $i < $length; $i++) {$string .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);}return $string;}/*** 创建随机唯一字符串* @param string $prefix 自定义前缀:WR-wechatReward* @param int $length 随机的字符串长度* @return string*/public function getUniqidStr($prefix = 'WR', $length = 4) {$string = "";for($i = 0; $i < $length; $i++) {$string .= mt_rand(0, 9);}return $prefix . uniqid() . $string;}/*** xml字符串转数组* @param $xml* @return mixed* @throws Exception*/public function xmlToArray($xml) {if (empty($xml)) {throw new Exception('xml数据不能为空');}//禁止引用外部xml实体 防XXE注入libxml_disable_entity_loader(true);$xmlString = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);$val = json_decode(json_encode($xmlString), true);return $val;}/*** 数组转XML字符串(包含CDATA)* @param $array* @return string*/public function arrayToXml($array) {$str = "<xml>";foreach ($array as $key => $val) {$str .= "<{$key}><![CDATA[{$val}]]></{$key}>";}$str .= "</xml>";return $str;}/*--------------------------------------------------------*//*-------------------- 其他自定义方法 ----------------------*//*--------------------------------------------------------*//*** 数组转XML字符串(不包含CDATA)* @param $array* @return string*/public function arrayToXmlNotCDATA($array) {$str = "<xml>";foreach ($array as $key => $val) {$str.="<{$key}>{$val}</{$key}>";}$str .= "</xml>";return $str;}
}

三、结果打印

打印截图

如果校验了证书,但是证书地址错误,则报错如下:

请求异常, errorCode:58

PHP调用微信发放现金红包接口相关推荐

  1. 微信支付现金红包接口(转)

    微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包.通过现金红包接口,公众号开发者可以策划相关运营活动,向用户发放微信支付现金红包,更好的达到品牌推广及回馈用户的效果.具体能力如下: 1 ...

  2. 微信支付现金红包接口应用实例代码说明和DEMO详解,适合用来做微信红包营销活动、吸粉利器...

    本文详细介绍微信红包开发的接口,商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,领取到红包后,用户的资金直接进入微信零钱.后面带有具体调用php实例 总结一下:需要注意的是PEM秘钥文件要 ...

  3. Vue h5 调用微信扫码接口

    需求 调用微信扫码接口,然后获取扫码返回结果的url中的参数,携参跳转到其他页面 1. 安装微信js-sdk 通过yarn安装 yarn add weixin-js-sdk 通过npm安装 npm i ...

  4. python 微信公众号网页接口调用_Python调用微信公众平台接口操作示例

    本文实例讲述了Python调用微信公众平台接口操作.分享给大家供大家参考,具体如下: 这里使用的是Django,其他类似 # coding=utf-8 from django.http import ...

  5. C# 调用微信公众号接口发送客服消息示例

    客服消息发送比较简单 注:指定openid和消息内容使用Post发送就可以,很多时候需要在触发事件或相应的情况下发送 官方文档:https://mp.weixin.qq.com/wiki?t=reso ...

  6. python连接微信接口开发教程_Python调用微信公众平台接口操作示例

    本文实例讲述了Python调用微信公众平台接口操作.分享给大家供大家参考,具体如下: 这里使用的是Django,其他类似 # coding=utf-8 from django.http import ...

  7. python微信api_Python调用微信公众平台接口操作示例

    本文实例讲述了Python调用微信公众平台接口操作.分享给大家供大家参考,具体如下: 这里使用的是Django,其他类似 # coding=utf-8 from django.http import ...

  8. python链接微信接口开发教程_Python调用微信公众平台接口操作示例

    本文实例讲述了Python调用微信公众平台接口操作.分享给大家供大家参考,具体如下: 这里使用的是Django,其他类似 # coding=utf-8 from django.http import ...

  9. php微信商务平台 红包调用,微信平台红包接口怎么调用?微信支付商户平台红包发放接口调用图文教程[多图]...

    微信平台红包接口怎么调用?估计很多商家都还不太会操作吧?别着急,下面是友情小编搜集相关资料整理出来的微信支付商户平台红包发放接口调用图文教程,希望可以帮到大家,现在就跟随小编一起看看吧!!! 首先,商 ...

  10. 共享一个调用微信公众平台接口的客户端类库

    由于我所开发活动项目经常要用到微信公众平台所提供的接口,所以本人专门开发了微信客户端的类库. 经过了几个项目的实践,特意将该类库共享出来.源代码已经放在了github上,供大家使用. 首先介绍一下设计 ...

最新文章

  1. 用于自动泊车的鸟瞰图的边缘线的语义SLAM系统
  2. 阿里2018营收2502亿元,云计算业务增幅超100%
  3. SCI录用的最后一步——答复审稿人的策略和答复信的写作技巧
  4. socket连接时间太长受什么原因影响?_真全粮多功能酿酒设备-酿酒发酵前期为什么要通风处理?...
  5. 杀鸡焉用牛刀!放下Windbg,让dotnet-stack来快速定位死锁原因
  6. AtCoder Beginner Contest 084(AB)
  7. 什么是简单的分析SQL注入漏洞
  8. 12种Javascript解决常见浏览器兼容问题的方法
  9. xgboost融合模型:大学助学金精准资助预测(有数据)
  10. 数据堂智能语音数据库,让客服更智能
  11. Linux上安装Oracle 10g 装后感
  12. Hystrix dashbord 服务降级熔断限流监控介绍
  13. 超星阅读器pdz文件转为xps文件或pdf文件说明
  14. IOMeter存储测试工具
  15. 信息系统项目管理师考试心得
  16. 【jQuery】jQuery本地时间与世界时间时差转换
  17. 谷歌Adsende中的 CPC、CTR、PRM含义
  18. pin limiting the speed
  19. linux下 不显示光驱,Windows7电脑下不显示光驱盘符的解决方法
  20. AFNetworking(v3.0+)框架学习总结(三框架基本使用)

热门文章

  1. F - 小希的迷宫 (并查集)
  2. 计算机导论大一知识点整理_电网计算机类考试?悄悄告诉你一个复习攻略!
  3. 湖北省土壤有机质空间分布数据
  4. 思科网院Packet Tracer实验(三)调查运行中的 TCP/IP和OSI模型
  5. chrome ubuntu_ubuntu 安装chrome
  6. java逆向框架_JOOQ框架学习(1):逆向编译生成代码
  7. python处理rgb_如何读取Python中给定像素的RGB值?
  8. 晨风机器人php接口程序_微信之后,QQ也开始封杀机器人了!!!
  9. python csv写入 不以科学计数法_【Python与GIS】聊聊Python与数据——上(三)
  10. 图:最新微软框架的现场计分双屏管理系统终于收工,大家请欣赏界面。