参考:
https://www.php.cn/php-weizijiaocheng-407545.html
废话不多说,直接上代码:
public function demo()
{
// 获取微信回调的数据
$notifiedData = file_get_contents('php://input');
//XML格式转换
$xmlObj = simplexml_load_string($notifiedData, 'SimpleXMLElement', LIBXML_NOCDATA);
$xmlObj = json_decode(json_encode($xmlObj),true);
$key = "公众号的key";
//请求回来的数据格式
// $xmlObj = [
// 'appid' => 'wxf546a8df41c2ce18',
// 'attach' => '商品',
// 'bank_type' => 'CFT',
// 'cash_fee' => '1',
// 'fee_type' => 'CNY',
// 'is_subscribe' => 'Y',
// 'mch_id' => '1534940151',
// 'nonce_str' => 'jld6md2ky75emve7spsrf2tolturngrm',
// 'openid' => 'oyljP5y2HbOHsEAuOLpHP2dXQChw',
// 'out_trade_no' => '20190808164259728748651734197807',
// 'result_code' => 'SUCCESS',
// 'return_code' => 'SUCCESS',
// 'sign' => 'A68DC8C8E61DCA90D4454963982A7B12',
// 'time_end' => '20190808164308',
// 'total_fee' => '1',
// 'trade_type' => 'JSAPI',
// 'transaction_id' => '4200000342201908088760422065',
// ];
//是否成功支付
if ($xmlObj['return_code'] == "SUCCESS" && $xmlObj['result_code'] == "SUCCESS") {
//把签名去掉
$xmlSign = $xmlObj['sign'];
unset($xmlObj['sign']);
$sign = $this -> appgetSign($xmlObj,$key);
if ($sign === $xmlSign)
{
//验证通过,确认已经支付
//告诉微信不用重复通知
return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
}
}
}
/*
* 格式化参数格式化成url参数 生成签名sign
*/
private function appgetSign($Obj,$appwxpay_key)
{
foreach ($Obj as $k => $v)
{
$Parameters[$k] = $v;
}
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this -> ToUrlParams($Parameters);
//签名步骤二:在string后加入KEY
if($appwxpay_key){
$String = $String."&key=".$appwxpay_key;
}
//签名步骤三:MD5加密
$String = md5($String);
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
return $result_;
}
private function ToUrlParams($Parameters)
{
$buff = "";
foreach ($Parameters as $k => $v)
{
if($k != "sign" && $v != "" && !is_array($v)){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}