WechatMchPay.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. /**
  3. * @note: 微信企业付款
  4. * @author: jdzor <895947580@qq.com>
  5. * @date: 2019/3/29
  6. */
  7. namespace payment\wechat;
  8. /**
  9. * 接口文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
  10. *
  11. * 使用方法:
  12. * $wechatMchPay = new WechatMchPay($config);
  13. * $info = $wechatMchPay->payChange($param);
  14. * $info = $wechatMchPay->queryChange($partnerTradeNo);
  15. * $info['return_code'] == 'FAIL' && json_error($info['return_msg'], -2);
  16. * $info['result_code'] == 'FAIL' && json_error($info['err_code_des'], -2);
  17. *
  18. * Class WechatMchPay
  19. * @package app\common\extend\wechat
  20. */
  21. class WechatMchPay extends BaseWechat
  22. {
  23. const TRANSFERS_URL = '/mmpaymkttransfers/promotion/transfers'; //企业付款到零钱
  24. const TRANSFERS_QUERY_URL = '/mmpaymkttransfers/gettransferinfo'; //查询企业付款到零钱
  25. private $checkName = 'NO_CHECK'; //NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名
  26. public function __construct($config)
  27. {
  28. parent::__construct($config);
  29. isset($config['sslcert_path']) && $this->sslcertPath = $config['sslcert_path'];
  30. isset($config['sslkey_path']) && $this->sslkeyPath = $config['sslkey_path'];
  31. }
  32. private function checkSsl()
  33. {
  34. $this->sslcertPath || json_error('缺少参数:sslcert_path'); //证书必传
  35. $this->sslkeyPath || json_error('缺少参数:sslkey_path');
  36. }
  37. //企业付款参数检测
  38. private function check($param, $method)
  39. {
  40. $this->checkSsl();
  41. if ($method == self::TRANSFERS_URL) {
  42. isset($param['partner_trade_no']) || json_error('缺少参数:partner_trade_no');
  43. isset($param['openid']) || json_error('缺少参数:openid');
  44. isset($param['amount']) || json_error('缺少参数:amount');
  45. isset($param['desc']) || json_error('缺少参数:desc');
  46. if ($this->checkName == 'FORCE_CHECK') {
  47. isset($param['re_user_name']) || json_error('缺少参数:re_user_name');
  48. }
  49. }
  50. }
  51. //企业付款到零钱
  52. public function payChange($param)
  53. {
  54. $this->check($param, self::TRANSFERS_URL);
  55. $data['mch_appid'] = $this->appId;
  56. $data['mchid'] = $this->mchId;
  57. $data['nonce_str'] = $this->getRandomString();
  58. $data['partner_trade_no'] = $param['partner_trade_no']; //商户订单号,需保持唯一性(只能是字母或者数字,不能包含有其他字符)
  59. $data['openid'] = $param['openid']; //商户appid下,某用户的openid
  60. $data['check_name'] = $this->checkName;
  61. $data['check_name'] == 'FORCE_CHECK' && $data['re_user_name'] = $param['re_user_name']; //收款用户真实姓名,如果check_name设置为FORCE_CHECK,则必填用户真实姓名
  62. $data['amount'] = $param['amount']; //企业付款金额,单位为分
  63. $data['desc'] = $param['desc']; //企业付款备注,必填。注意:备注中的敏感词会被转成字符*
  64. $data['spbill_create_ip'] = get_client_ip();
  65. $data['sign'] = $this->makeSign($data);
  66. $xml = $this->dataToXml($data);
  67. $response = $this->postXmlCurl($xml, self::TRANSFERS_URL, true);
  68. if (!$response) return false;
  69. $result = $this->xmlToArray($response);
  70. return $result;
  71. }
  72. //查询企业付款到零钱 查询企业付款API只支持查询30天内的订单,30天之前的订单请登录商户平台查询
  73. public function queryChange($partnerTradeNo)
  74. {
  75. $this->checkSsl();
  76. $data['appid'] = $this->appId;
  77. $data['mch_id'] = $this->mchId;
  78. $data['nonce_str'] = $this->getRandomString();
  79. $data['partner_trade_no'] = $partnerTradeNo; //商户订单号,需保持唯一性(只能是字母或者数字,不能包含有其他字符)
  80. $data['sign'] = $this->makeSign($data);
  81. $xml = $this->dataToXml($data);
  82. $response = $this->postXmlCurl($xml, self::TRANSFERS_QUERY_URL, true);
  83. if (!$response) return false;
  84. $result = $this->xmlToArray($response);
  85. return $result;
  86. }
  87. }