ThinkPHP5.1开发企业微信支付到零钱

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' => '',
];

微信公众平台支付接口调试工具

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值