扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。前几天公司需要做了一下扫码支付 分享一下
<?php
namespace common;
use app\common\controller\Common;
use app\common\model\LibWechatConfig;
/**
* 提供微信支付服务管理服务
* @name WxCodePay.php
* @package jypp
* @category model
* @link http://www.chanekeji.com
* @author mengchen
* @version 1.0
* @copyright CHANGE INC
* @since 2023-02-15
*/
class WxPay
{
public $key; //支付秘钥需要更改成自己的
public $appId; //APPID需要更改为自己的
public $mchId; //商户号需要更改成自己的
public $secret; //开发者密码需要更改为自己的
public $uoUrl = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; //无需更改 统一下单API地址
public $notifyURL; //支付通知地址需要更改成你自己服务器的地址
public function __construct()
{
$LibWechatConfig = new LibWechatConfig();
$config = $LibWechatConfig->findConfigKeyValue('wechat');
$config = $config['data'];
$this->appId = $config['wx_appid'];
$this->mchId = $config['wx_mchid'];
$this->secret = $config['wx_secret'];
$this->key = $config['wx_pay_key'];
$this->notifyURL = $config['wx_notify_url'];
}
//获取签名
public function getSign($arr)
{
//去除数组的空值
array_filter($arr);
if (isset($arr['sign'])) {
unset($arr['sign']);
}
//排序
ksort($arr);
//组装字符
$str = $this->arrToUrl($arr) . '&key=' . $this->key;
//使用md5 加密 转换成大写
return strtoupper(md5($str));
}
//获取带签名的数组
public function setSign($arr)
{
$arr['sign'] = $this->getSign($arr);
return $arr;
}
//校验签名
public function checkSign($arr)
{
//生成新签名
$sign = $this->getSign($arr);
//和数组中原始签名比较
if ($sign == $arr['sign']) {
return true;
} else {
return false;
}
}
//数组转URL字符串 不带key
public function arrToUrl($arr)
{
return urldecode(http_build_query($arr));
}
//记录到文件
public function logs($file, $data)
{
$data = is_array($data) ? print_r($data, true) : $data;
file_put_contents('./logs/' . $file, $data);
}
public function getPost()
{
return file_get_contents('php://input');
}
//Xml 文件转数组
public function XmlToArr($xml)
{
if ($xml == '') return '';
if (PHP_VERSION_ID < 80000) { libxml_disable_entity_loader(true); }
$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $arr;
}
//数组转XML
public function ArrToXml($arr)
{
if (!is_array($arr) || count($arr) == 0) return '';
$xml = "<xml>";
foreach ($arr as $key => $val) {
if (is_numeric($val)) {
$xml .= "<" . $key . ">" . $val . "</" . $key . ">";
} else {
$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
}
}
$xml .= "</xml>";
return $xml;
}
//post 字符串到接口
public function postStr($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_SSL_VERIFYPEER] = false; //禁用证书校验
$params[CURLOPT_SSL_VERIFYHOST] = false;
$params[CURLOPT_POSTFIELDS] = $postfields;
curl_setopt_array($ch, $params); //传入curl参数
$content = curl_exec($ch); //执行
curl_close($ch); //关闭连接
return $content;
}
//统一下单
public function unifiedorder($params)
{
//获取到带签名的数组
$params = $this->setSign($params);
//数组转xml
$xml = $this->ArrToXml($params);
//发送数据到统一下单API地址
$data = $this->postStr($this->uoUrl, $xml);
$arr = $this->XmlToArr($data);
if ($arr['result_code'] == 'SUCCESS' && $arr['return_code'] == 'SUCCESS') {
return ['errorCode' => 0,'errorInfo'=>'下单成功', 'data' => $arr];
} else {
$this->logs('error.txt', $data);
return ['errorCode' => 1,'errorInfo'=>'下单失败', 'data' => []];
}
}
}
微信扫码支付不如支付宝扫码支付便捷。需要自己做很多处理。
以上所述是小编给大家PHP 微信扫码支付接入demo,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!