121 lines
5.0 KiB
PHP
121 lines
5.0 KiB
PHP
|
<?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");
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|