今天公司要用到就重新拿demo封装了一遍,如果要用到框架上还需要自己加入命名空间跟接入微信SDK的config配置参数…

具体Class代码如下:

  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 微信商户零钱打款给openid
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2018 https://blog.junphp.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: 小黄牛 <1731223728@qq.com>
  10. // +----------------------------------------------------------------------
  11. class Wxshop_price {
  12. // 应用ID
  13. private static $APPID = '';
  14. // 商户ID
  15. private static $MCHID = '';
  16. // 支付密钥签名
  17. private static $SECRECT_KEY = '';
  18. // 服务器IP
  19. private static $IP = '';
  20. // 证书存放地址
  21. private static $ROOT_PATH = '';
  22. // 用于保存第一次的实例结果
  23. private static $instance;
  24. // 私有化构造函数,可以保证在类外该类不能被实例化
  25. private function __construct() {
  26. self::$APPID = '';
  27. self::$MCHID = '';
  28. self::$SECRECT_KEY = '';
  29. self::$IP = '';
  30. self::$ROOT_PATH = '';
  31. }
  32. // 用于初始化单例类
  33. public static function run(){
  34. if(!self::$instance instanceof self){
  35. self::$instance = new self();
  36. return self::$instance;
  37. }else{
  38. return self::$instance;
  39. }
  40. }
  41. /**
  42. * 执行付款
  43. * @todo 无
  44. * @author 小黄牛
  45. * @version v1.0.1 + 2019.05.06
  46. * @deprecated 暂不弃用
  47. * @global 无
  48. * @param float $amount 发送的金额(分)目前发送金额不能少于0.3元
  49. * @param string $re_openid, 发送人的 openid
  50. * @param string $desc 企业付款描述信息 (必填)
  51. * @param string $check_name 收款用户姓名 (选填)
  52. * @param bool $status 是否输出结果到浏览器 (选填)
  53. * @return bool|array
  54. */
  55. public function go($amount, $re_openid, $desc='测试', $check_name='', $status=false) {
  56. if ($amount < 0.3) return false;
  57. $total_amount = (100) * $amount;
  58. $data = [
  59. 'mch_appid' => self::$APPID, //商户账号appid
  60. 'mchid' => self::$MCHID, //商户号
  61. 'nonce_str' => $this->createNoncestr(), //随机字符串
  62. 'partner_trade_no' => date('YmdHis').rand(1000, 9999), //商户订单号
  63. 'openid' => $re_openid, //用户openid
  64. 'check_name' => 'NO_CHECK', //校验用户姓名选项,
  65. 're_user_name' => $check_name, //收款用户姓名
  66. 'amount' => $total_amount, //金额
  67. 'desc' => $desc, //企业付款描述信息
  68. 'spbill_create_ip' => self::$IP, //Ip地址
  69. ];
  70. $secrect_key = self::$SECRECT_KEY; //这个API密码,MD5 32位。
  71. $data = array_filter($data);
  72. ksort($data);
  73. $str = '';
  74. foreach ($data as $k=>$v) {
  75. $str .= $k.'='.$v.'&';
  76. }
  77. $str .= 'key='.$secrect_key;
  78. $data['sign'] = md5($str);
  79. $xml = $this->arraytoxml($data);
  80. $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
  81. $res = $this->curl($xml,$url);
  82. $return = $this->xmltoarray($res);
  83. // 如果返回来SUCCESS,则发生成功,处理自己的逻辑
  84. $res = $return['return_code']; //SUCCESS
  85. if ($status == true) {
  86. echo $res;
  87. }
  88. if ($res == 'SUCCESS') return $return;
  89. return false;
  90. }
  91. /**
  92. * 生成随机字符串
  93. * @todo 无
  94. * @author 小黄牛
  95. * @version v1.0.1 + 2019.04.29
  96. * @deprecated 暂不弃用
  97. * @global 无
  98. * @param int $length 长度
  99. * @return string
  100. */
  101. private function createNoncestr($length =32) {
  102. $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
  103. $str ="";
  104. for ($i=0; $i < $length; $i++) {
  105. $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
  106. }
  107. return $str;
  108. }
  109. /**
  110. * 数组转XML
  111. * @todo 无
  112. * @author 小黄牛
  113. * @version v1.0.1 + 2019.05.06
  114. * @deprecated 暂不弃用
  115. * @global 无
  116. * @param array $data 数组
  117. * @return XML
  118. */
  119. private function arraytoxml($data){
  120. $str='<xml>';
  121. foreach($data as $k=>$v) {
  122. $str.='<'.$k.'>'.$v.'</'.$k.'>';
  123. }
  124. $str.='</xml>';
  125. return $str;
  126. }
  127. /**
  128. * XML转数据
  129. * @todo 无
  130. * @author 小黄牛
  131. * @version v1.0.1 + 2019.05.06
  132. * @deprecated 暂不弃用
  133. * @global 无
  134. * @param xml $param XML
  135. * @return array
  136. */
  137. private function xmltoarray($xml) {
  138. //禁止引用外部xml实体
  139. libxml_disable_entity_loader(true);
  140. $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
  141. $val = json_decode(json_encode($xmlstring),true);
  142. return $val;
  143. }
  144. /**
  145. * 发起请求
  146. * @todo 无
  147. * @author 小黄牛
  148. * @version v1.0.1 + 2019.05.06
  149. * @deprecated 暂不弃用
  150. * @global 无
  151. * @param xml $param 请求参数
  152. * @param string $url 请求地址
  153. * @return void
  154. */
  155. private function curl($param="",$url) {
  156. $postUrl = $url;
  157. $curlPost = $param;
  158. $ch = curl_init(); // 初始化curl
  159. curl_setopt($ch, CURLOPT_URL,$postUrl); // 抓取指定网页
  160. curl_setopt($ch, CURLOPT_HEADER, 0); // 设置header
  161. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 要求结果为字符串且输出到屏幕上
  162. curl_setopt($ch, CURLOPT_POST, 1); // post提交方式
  163. curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); // 增加 HTTP Header(头)里的字段
  164. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 终止从服务端进行验证
  165. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  166. curl_setopt($ch,CURLOPT_SSLCERT, self::$ROOT_PATH .'apiclient_cert.pem'); //这个是证书的位置绝对路径
  167. curl_setopt($ch,CURLOPT_SSLKEY, self::$ROOT_PATH .'apiclient_key.pem'); //这个也是证书的位置绝对路径
  168. $data = curl_exec($ch); //运行curl
  169. curl_close($ch);
  170. return $data;
  171. }
  172. // 禁止克隆单例类,防止二次new
  173. private function __clone(){
  174. die('此对象不允许克隆');
  175. }
  176. }