qingjian/app/service/WechatMiniPay.php

121 lines
5.0 KiB
PHP
Raw Permalink Normal View History

2021-08-06 10:50:55 +00:00
<?php
namespace app\service;
use think\facade\Config;
class WechatMiniPay
{
protected $WechatMiniPayConfig = [];//微信设置
// 初始化
public function __construct()
{
Config::load('extra/wechat', 'wechat');
$this->WechatMiniPayConfig = config('wechat');
}
/**
* 微信小程序支付
* @static
* @access public
* @param $order_number 订单号
* @param $open_id 用户openid
* @param $total_fee 支付金额
* @param $body 支付抬头
* @param $attach 附加数据
*/
public function dopay(string $order_number = "",
string $open_id = "",
float $total_fee = 0,
string $body = "充值",
string $attach = "充值" ,
string $notify_url = ""
)
{
if (!$order_number || !$open_id || !$total_fee || !$body || !$attach) {
return ["state" => "fail"];
}
// 开始组建支付数据数组
$data['param'] = [];
$data['param']['appid'] = $this->WechatMiniPayConfig["appId"];
$data['param']['mch_id'] = $this->WechatMiniPayConfig["mchId"];
$data['param']['nonce_str'] = randomStr(0, 16);
$data['param']['body'] = $body;
$data['param']['out_trade_no'] = $order_number;//商户下的唯一订单号
// $data['param']['total_fee'] = $total_fee * 100; // 单位:分
$data['param']['total_fee'] = 1; // 单位:分
$data['param']['spbill_create_ip'] = request()->ip();
$data['param']['notify_url'] = $notify_url;
$data['param']['trade_type'] = 'JSAPI';//支付方式 NATIVE表示二维码支付
// $data['param']['product_id'] = $order["commodity_id"];//商品id 非必填
$data['param']['attach'] = $attach;//附加数据 附加数据在查询API和支付通知中原样返回可作为自定义参数使用。
$data['param']['openid'] = $open_id;//用户openid
$data['param']['sign'] = wechatSign($data['param'], $this->WechatMiniPayConfig["mchKey"]); //key为商户平台设置的密钥key
$pay_data = array_to_xml($data['param']);
//请求支付 JSAPI 不会直接吊起支付请求 返回prepay_id是微信生成的预支付会话标识用于后续接口调用中使用
$result_data2 = Tool::httpRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", "post", $pay_data);
$result_data = xmlToArray($result_data2);
//如果返回数据验证成功
if (isset($result_data["prepay_id"]) && isset($result_data["result_code"]) && $result_data["return_code"] == "SUCCESS" && $result_data["result_code"] == "SUCCESS") {
$js_data = [];
$js_data["appId"] = $this->WechatMiniPayConfig["appId"];
$js_data["timeStamp"] = (string)time();
$js_data["nonceStr"] = $data['param']['nonce_str'];
$js_data["package"] = "prepay_id=" . $result_data["prepay_id"];
$js_data["signType"] = "MD5";
$js_data["paySign"] = wechatSign($js_data, $this->WechatMiniPayConfig["mchKey"]);;
return ["state" => "ok", "data" => $js_data];
} else {
return (["state" => "fail",
"message" => "fail:" .
(isset($result_data["err_code_des"])
?
$result_data["err_code_des"]
:
'错误'
)]);
}
}
/**
* 微信支付查询
* @param $order_number 订单号
*/
public function wechatQueryOrder($order_number = "")
{
if (empty($order_number)) {
return ["state" => "fail", "message" => "fail"];
}
$data['param'] = [];
$data['param']['appid'] = $this->WechatMiniPayConfig["appId"];
$data['param']['mch_id'] = $this->WechatMiniPayConfig["mchId"];
$data['param']['nonce_str'] = randomStr(0, 16);
$data['param']['out_trade_no'] = $order_number;//商户下的唯一订单号
$data['param']['sign'] = wechatSign($data['param'], $this->WechatMiniPayConfig["mchKey"]); //key为商户平台设置的密钥key
$xml = array_to_xml($data['param']);
$wechat_data = Tool::httpRequest("https://api.mch.weixin.qq.com/pay/orderquery", "post", $xml);
$wechat_data = xmlToArray($wechat_data);
if ($wechat_data["return_code"] == "SUCCESS") {// 通信标识
if ($wechat_data["result_code"] == "SUCCESS") {//业务标识 订单不存在或者微信服务器错误
if ($wechat_data["trade_state"] == "SUCCESS") {//如果支付成功
return array("state" => "ok", "queryData" => $wechat_data);
}
}
}
return array("state" => "fail");
}
}