Wxpay.php
<?php
//企业支付到零钱
namespace app\wechat\controller;
use think\Controller;
use think\facade\Request;
class Wxpay extends Controller {
private $params;
public function initialize() {
//模拟原始数据
$this->params = [
'amount' => '1', //金额 单位分
'check_name' => 'NO_CHECK', //校验用户姓名选项 NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名
'desc' => 'tx', //付款描述
'mch_appid' => config('wechat.appid'), //APPid,
'mchid' => config('wechat.mchid'), //商户号,
'nonce_str' => md5(time()), //随机字符串
'openid' => getOpenId(), //用户openid
'partner_trade_no' => date('YmdHis'), //商户订单号
'spbill_create_ip' => Request::ip(), //调用接口机器的ip地址
];
}
public function index() {
$res = $this->sign();
$dat = ArrToXml($res);
$xml = iconv('UTF-8', 'ISO8859-1', $dat);
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
$returnXml = postData($url, $xml);
$returnArr = XmlToArr($returnXml);
dump($returnArr);
}
public function sign() {
return $this->setSign($this->params);
}
/**
* 获取签名
* @param array $arr
* @return string
*/
public function getSign($arr) {
//去除空值
$arrfilter = array_filter($arr);
if (isset($arrfilter['sign'])) {
unset($arrfilter['sign']);
}
//按照键名字典排序
ksort($arrfilter);
//生成url格式的字符串
$str = $this->arrToUrl($arr) . '&key=' . config('wechat.key');
// echo $str;die;
return strtoupper(md5($str));
}
/**
* 获取带签名的数组
* @param array $arr
* @return array
*/
public function setSign($arr) {
$arr['sign'] = $this->getSign($arr);
return $arr;
}
/**
* 数组转URL格式的字符串
* @param array $arr
* @return string
*/
public function arrToUrl($arr) {
return urldecode(http_build_query($arr));
}
}
公共方法:common.php
//数组转xml
function ArrToXml($arr) {
if (!is_array($arr) || count($arr) == 0) {
return '';
}
$xml = "<xml>";
foreach ($arr as $key => $val) {
$xml .= "<" . $key . ">" . $val . "</" . $key . ">";
}
$xml .= "</xml>";
return $xml;
}
//Xml转数组
function XmlToArr($xml) {
if ($xml == '') {
return '';
}
libxml_disable_entity_loader(true);
$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $arr;
}
//CURL携带ssl证书和秘钥
function postData($url, $postfields) {
$ch = curl_init();
$params[CURLOPT_URL] = $url; //请求url地址
$params[CURLOPT_HEADER] = false; //是否返回响应头信息
$params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
$params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
$params[CURLOPT_POST] = true;
$params[CURLOPT_POSTFIELDS] = $postfields;
$params[CURLOPT_SSL_VERIFYPEER] = false;
$params[CURLOPT_SSL_VERIFYHOST] = false;
//以下是证书相关代码
$params[CURLOPT_SSLCERTTYPE] = 'PEM';
$params[CURLOPT_SSLCERT] = 'apiclient_cert.pem';
$params[CURLOPT_SSLKEYTYPE] = 'PEM';
$params[CURLOPT_SSLKEY] = 'apiclient_key.pem';
curl_setopt_array($ch, $params); //传入curl参数
$content = curl_exec($ch); //执行
curl_close($ch); //关闭连接
return $content;
}
//获取用户OpenId
function getOpenId() {
$openid = Cache::get('openid');
if ($openid) {
return $openid;
} else {
//1.用户访问一个地址 先获取到code
if (Request::get('code') == null) {
//构建回调地址为当前地址
$redurl = Request::server('REQUEST_SCHEME') . '://' . Request::server('HTTP_HOST') . Request::server('REQUEST_URI');
$reurl = urlEncode($redurl);
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?' . "appid=" . config('wechat.appid') . "&redirect_uri=" . $reurl . "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
//响应跳转请求
header("location:{$url}");
exit;
} else {
//2.根据code获取到openid
//调用接口获取openid
$openidurl = 'https://api.weixin.qq.com/sns/oauth2/access_token?' . "appid=" . config('wechat.appid') . "&secret=" . config('wechat.secret') . "&code=" . Request::get('code') . "&grant_type=authorization_code";
$data = curl_request($openidurl);
$arr = json_decode($data, true);
Cache::set('openid', $arr['openid']);
return $arr['openid'];
}
}
}
配置文件:wechat.php
<?php
return [
'key' => '',
'mchid' => '',
'appid' => '',
'secret' => '',
];
微信公众平台支付接口调试工具