今天公司要用到就重新拿demo封装了一遍,如果要用到框架上还需要自己加入命名空间跟接入微信SDK的config配置参数…
具体Class代码如下:
<?php
// +----------------------------------------------------------------------
// | 微信商户零钱打款给openid
// +----------------------------------------------------------------------
// | Copyright (c) 2018 https://blog.junphp.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 小黄牛 <1731223728@qq.com>
// +----------------------------------------------------------------------
class Wxshop_price {
// 应用ID
private static $APPID = '';
// 商户ID
private static $MCHID = '';
// 支付密钥签名
private static $SECRECT_KEY = '';
// 服务器IP
private static $IP = '';
// 证书存放地址
private static $ROOT_PATH = '';
// 用于保存第一次的实例结果
private static $instance;
// 私有化构造函数,可以保证在类外该类不能被实例化
private function __construct() {
self::$APPID = '';
self::$MCHID = '';
self::$SECRECT_KEY = '';
self::$IP = '';
self::$ROOT_PATH = '';
}
// 用于初始化单例类
public static function run(){
if(!self::$instance instanceof self){
self::$instance = new self();
return self::$instance;
}else{
return self::$instance;
}
}
/**
* 执行付款
* @todo 无
* @author 小黄牛
* @version v1.0.1 + 2019.05.06
* @deprecated 暂不弃用
* @global 无
* @param float $amount 发送的金额(分)目前发送金额不能少于0.3元
* @param string $re_openid, 发送人的 openid
* @param string $desc 企业付款描述信息 (必填)
* @param string $check_name 收款用户姓名 (选填)
* @param bool $status 是否输出结果到浏览器 (选填)
* @return bool|array
*/
public function go($amount, $re_openid, $desc='测试', $check_name='', $status=false) {
if ($amount < 0.3) return false;
$total_amount = (100) * $amount;
$data = [
'mch_appid' => self::$APPID, //商户账号appid
'mchid' => self::$MCHID, //商户号
'nonce_str' => $this->createNoncestr(), //随机字符串
'partner_trade_no' => date('YmdHis').rand(1000, 9999), //商户订单号
'openid' => $re_openid, //用户openid
'check_name' => 'NO_CHECK', //校验用户姓名选项,
're_user_name' => $check_name, //收款用户姓名
'amount' => $total_amount, //金额
'desc' => $desc, //企业付款描述信息
'spbill_create_ip' => self::$IP, //Ip地址
];
$secrect_key = self::$SECRECT_KEY; //这个API密码,MD5 32位。
$data = array_filter($data);
ksort($data);
$str = '';
foreach ($data as $k=>$v) {
$str .= $k.'='.$v.'&';
}
$str .= 'key='.$secrect_key;
$data['sign'] = md5($str);
$xml = $this->arraytoxml($data);
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
$res = $this->curl($xml,$url);
$return = $this->xmltoarray($res);
// 如果返回来SUCCESS,则发生成功,处理自己的逻辑
$res = $return['return_code']; //SUCCESS
if ($status == true) {
echo $res;
}
if ($res == 'SUCCESS') return $return;
return false;
}
/**
* 生成随机字符串
* @todo 无
* @author 小黄牛
* @version v1.0.1 + 2019.04.29
* @deprecated 暂不弃用
* @global 无
* @param int $length 长度
* @return string
*/
private function createNoncestr($length =32) {
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ($i=0; $i < $length; $i++) {
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
/**
* 数组转XML
* @todo 无
* @author 小黄牛
* @version v1.0.1 + 2019.05.06
* @deprecated 暂不弃用
* @global 无
* @param array $data 数组
* @return XML
*/
private function arraytoxml($data){
$str='<xml>';
foreach($data as $k=>$v) {
$str.='<'.$k.'>'.$v.'</'.$k.'>';
}
$str.='</xml>';
return $str;
}
/**
* XML转数据
* @todo 无
* @author 小黄牛
* @version v1.0.1 + 2019.05.06
* @deprecated 暂不弃用
* @global 无
* @param xml $param XML
* @return array
*/
private function xmltoarray($xml) {
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$val = json_decode(json_encode($xmlstring),true);
return $val;
}
/**
* 发起请求
* @todo 无
* @author 小黄牛
* @version v1.0.1 + 2019.05.06
* @deprecated 暂不弃用
* @global 无
* @param xml $param 请求参数
* @param string $url 请求地址
* @return void
*/
private function curl($param="",$url) {
$postUrl = $url;
$curlPost = $param;
$ch = curl_init(); // 初始化curl
curl_setopt($ch, CURLOPT_URL,$postUrl); // 抓取指定网页
curl_setopt($ch, CURLOPT_HEADER, 0); // 设置header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_POST, 1); // post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); // 增加 HTTP Header(头)里的字段
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 终止从服务端进行验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch,CURLOPT_SSLCERT, self::$ROOT_PATH .'apiclient_cert.pem'); //这个是证书的位置绝对路径
curl_setopt($ch,CURLOPT_SSLKEY, self::$ROOT_PATH .'apiclient_key.pem'); //这个也是证书的位置绝对路径
$data = curl_exec($ch); //运行curl
curl_close($ch);
return $data;
}
// 禁止克隆单例类,防止二次new
private function __clone(){
die('此对象不允许克隆');
}
}