qingjian/app/service/WechatMiniPay.php

121 lines
5.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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");
}
}