public static function payToChange($mchid, $appId, $signKey, $openid, $amount, $desc, $selfIp, $apiClientCertPem, $apiClientKeyPem, $rootcaPem) { if (empty($mchid) || empty($appId) || empty($signKey) || empty($openid) || empty($amount) || empty($desc) || empty($selfIp) || empty($apiClientCertPem) || empty($apiClientKeyPem) || empty($rootcaPem)) { Log::error('wxpay tochange - params error! ' . json_encode(func_get_args())); return false; } $data = array('nonce_str' => Util::getRandomStr(32), 'mch_appid' => $appId, 'mchid' => $mchid, 'partner_trade_no' => $mchid . date('Ymd') . mt_rand(1000000000, 1999999999), 'check_name' => 'NO_CHECK', 'openid' => $openid, 'amount' => $amount, 'spbill_create_ip' => $selfIp, 'desc' => $desc); $data['sign'] = self::sign($data, $signKey); $postXml = Util::arrayToXml($data); $responseXml = HttpUtil::postSSL('https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers', $postXml, $apiClientCertPem, $apiClientKeyPem, $rootcaPem); if ($responseXml === false) { return false; } libxml_disable_entity_loader(true); $ret = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA); $ret = json_decode(json_encode($ret), true); if ($ret['return_code'] != 'SUCCESS') { Log::pay('wxpay tochange error - return_code FAIL, err=' . json_encode($ret, JSON_UNESCAPED_UNICODE) . ' data=' . json_encode(func_get_args(), JSON_UNESCAPED_UNICODE)); return false; } if ($ret['result_code'] != 'SUCCESS') { Log::pay('wxpay tochange error - result_code FAIL, err=' . json_encode($ret, JSON_UNESCAPED_UNICODE) . ' data=' . json_encode(func_get_args(), JSON_UNESCAPED_UNICODE)); if ($ret['err_code'] == 'NOTENOUGH') { // TODO } return false; } return $ret; }