IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP 微信JSP支付 -> 正文阅读

[PHP知识库]PHP 微信JSP支付

微信支付所需参数

openId? ? ? ? ?//微信用户ID? 登录授权时获取

appid? ? ? ? ? ?//公众号appid? 微信公众号获取

appSecret? ? //公众号appkey? 微信公众号后台获取??

mch_id? ? ? ? ?//商户号mechid? ?微信商户号后台获取

mchsecret? ? //商户api秘钥? 微信商户号后台获取

    //控制器操作
    public function Pay(){
        
        $fee = '0.01'; //支付金额
        $body = '微信支付测试'; //交易描述
        $openid =''; 发起支付的用户openid
        $data = ['body' => $body , 'fee' => $fee , 'openId' => $openid];

        $data['out_trade_no'] = '65461348974616'; //支付订单号
        $result = $this -> toPay($data); 
        if($result['return_code'] == "SUCCESS" && $result['result_code'] == "SUCCESS"){
            return json($this->returnData('99','支付成功',$result));
        }else{
            $data['RETURN_CODE'] = $result['RETURN_CODE'];
            $data['RETURN_MSG'] = $result['RETURN_MSG'];
            return json($this -> returnData(1, '未知错误',$data));
        }
        
    }
    
public function toPay($param)
{
    $resData = [];
    $body = empty($param['body']) ? '' : $param['body'];  //描述
    $orderSn = $param['out_trade_no']; //订单号
    $totalFee = empty($param['fee']) ? 0.01 : $param['fee'];   //金额
    $openId = empty($param['openId']) ? '' : $param['openId'];  //用户openId
    //统一下单参数构造
    $unifiedOrder = array(
        'appid' => $this ->AppID, //公众号appid
        'mch_id' => $this ->MchId,  //商户号mchid
        'nonce_str' => $this->getNonceStr(), //随机字符串
        'body' => $body,  //支付描述
        'out_trade_no' => $orderSn,   //订单号
        'total_fee' => $totalFee*100,   //支付金额
        'spbill_create_ip' => $this->getIp(),  //获取本地id
        'notify_url' => $this->_payCfg['notify_url'],//todo 你的支付回调url
        'trade_type' => 'JSAPI',   //支付类型
        'openid' => $openId     //支付用户openid
    );
    $unifiedOrder['sign'] = $this->makeSign($unifiedOrder);
    //请求数据,统一下单
    $xmlData = $this->toxml($unifiedOrder);
    $res = $this->postxmlCurl($this->_payCfg['request_url'], $xmlData);
    $content = $this->toArr($res);
    $res = self::xmlToArray($res);
    $res['pay'] = $unifiedOrder;
    return $res;
}

/**
 * 生成签名
 * @param $unifiedOrder
 * @param $mchSecret
 * @return string
 */
public function makeSign($unifiedOrder)
{
   //签名步骤一:按字典序排序参数
   ksort($unifiedOrder);
   $string = $this->toUrlParams($unifiedOrder);
   //签名步骤二:在string后加入KEY
   $string = $string . "&key=" . $this -> MchSecret;
   //签名步骤三:MD5加密
   $string = md5($string);
   //签名步骤四:所有字符转为大写
   $result = strtoupper($string);
   return $result;
}
/**
 * 格式化参数格式化成url参数
 * @param $unifiedOrder
 * @return string
 * @internal param $unifiedOrder
 */
public function toUrlParams($unifiedOrder)
{
    $buff = "";
    foreach ($unifiedOrder as $k => $v) {
      if ($k != "sign" && $v != "" && !is_array($v)) {
         buff .= $k . "=" . $v . "&";
      }
    }
    $buff = trim($buff, "&");
    return $buff;
}

/**
 * 输出xml字符
 * @param $unifiedOrder
 * @return string
 */
public function toxml($unifiedOrder)
{
    if (!is_array($unifiedOrder) || count($unifiedOrder) <= 0) exit('数组异常');

    $xml = "<xml>";
    foreach ($unifiedOrder as $key => $val) {
        if (is_numeric($val)) {
            $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
        } else {
            $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
        }
    }
    $xml .= "</xml>";
    return $xml;
}

/**
 * auth: bruce
 * 以post方式提交xml到对应的接口url
 * 2021/3/23
 * @param $url
 * @param $xml
 * @param int $time_out
 * @param bool $cert
 * @return bool|string
 */
public function postxmlCurl($url, $xml, $time_out = 30)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_TIMEOUT, $time_out);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    $data = curl_exec($ch);
    if ($data) {
        curl_close($ch);
        return $data;
    } else {
        $error = curl_errno($ch);
        curl_close($ch);
        exit("curl出错,错误码:$error");
    }
}
/**
 * 将xml转为array
 * @param $xml
 * @return mixed
 */
public function toArr($xml){
    //将xml转为array,禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    return $values;
}
/**
 * XML 转数组
 * @param $xml
 * @return mixed
 */
private function xmlToArray($xml)
{
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    return $values;
    }

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:31:11  更:2021-11-11 12:31:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/14 14:39:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码