php获取微信小程序支付结果通知

php获取微信小程序支付结果通知

在这里插入图片描述

<?php


/**
 * 异步回调通知
 * 说明:【统一下单API】中提交的参数notify_url设置例如:http://www.xxx.com/notify.php
 * 付款成功后,微信服务器会将付款结果通知到该页面
 * 解析:就是说,完成支付成功后,小程序支付会执行你设置的回调地址 notify_url 并返回xml数据

 * 通知url必须为直接可访问的url,不能携带参数。示例:notify_url:“http://www.xxx.com/notify.php”

 * 该链接是通过【统一下单API】中提交的参数notify_url设置,如果链接无法访问,商户将无法接收到微信通知。
 * 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。

 * 设置你自己的notify_url,可以用      ngrok   工具实现外网映射本地主机,就可以在微信开发工具调试了
 * ngrok官网(https://ngrok.com/)
 * notify_url,要访问的地址,就是下面的php文件,不废话,上代码

 */

header('Content-type:text/html; Charset=utf-8');
$mchid = '1313*******';          //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送
$appid = 'wx123***********';  //公众号APPID 通过微信支付商户资料审核后邮件发送
$apiKey = '4w***************';   //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥
$wxPay = new WxpayService($mchid,$appid,$apiKey);

$result = $wxPay->notify();
if($result){

    //完成你的逻辑
    //例如连接数据库,获取付款金额$result['cash_fee'],获取订单号$result['out_trade_no'],修改数据库中的订单状态等;
    //现金支付金额:$result['cash_fee']
    //订单金额:$result['total_fee']
    //商户订单号:$result['out_trade_no']
    //付款银行:$result['bank_type']
    //货币种类:$result['fee_type']
    //是否关注公众账号:$result['is_subscribe']
    //用户标识:$result['openid']
    //业务结果:$result['result_code']  SUCCESS/FAIL
    //支付完成时间:$result['time_end']  格式为yyyyMMddHHmmss
    //具体详细请看微信xiaochengxu文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7&index=8


	$cash_fee=$result['cash_fee'];
	$total_fee=$result['total_fee'];
	$out_trade_no=$result['out_trade_no'];
	$time_end=$result['time_end'];
	$bank_type=$result['bank_type'];
	$fee_type=$result['fee_type'];
	$is_subscribe=$result['is_subscribe'];
	$openid=$result['openid'];
	$result_code=$result['result_code'];
	$transaction_id=$result['transaction_id'];

    $sql ="INSERT INTO pay_test (cash_fee,total_fee,out_trade_no,time_end) VALUES ('$cash_fee','$total_fee','$out_trade_no','$time_end')";

    $mysqli = mysqli_connect("localhost","用户名","密码","数据库","端口")or die("mysqli_error: " . mysqli_error());

    mysqli_query($mysqli,$sql);
	



}else{
    echo '没有获取到xml数据';
}
class WxpayService
{
    protected $mchid;
    protected $appid;
    protected $apiKey;
    public function __construct($mchid, $appid, $key)
    {
        $this->mchid = $mchid;
        $this->appid = $appid;
        $this->apiKey = $key;
    }

    public function notify()
    {
        $config = array(
            'mch_id' => $this->mchid,
            'appid' => $this->appid,
            'key' => $this->apiKey,
        );
        $postStr = file_get_contents('php://input');
		//禁止引用外部xml实体
		libxml_disable_entity_loader(true);

        //转换形式良好的 XML 字符串为 SimpleXMLElement 对象,然后输出对象的键和元素
        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        if ($postObj === false) {
            die('xml数据 error');
        }
        if ($postObj->return_code != 'SUCCESS') {
            die($postObj->return_msg);
        }
        if ($postObj->result_code != 'SUCCESS') {
            die($postObj->err_code);
        }
        $arr = (array)$postObj;
        unset($arr['sign']);
        if (self::getSign($arr, $config['key']) == $postObj->sign) {
            echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
            return $arr;
        }
    }

    /**
     * 获取签名
     */
    public static function getSign($params, $key)
    {
        ksort($params, SORT_STRING);
        $unSignParaString = self::formatQueryParaMap($params, false);
        $signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
        return $signStr;
    }
    protected static function formatQueryParaMap($paraMap, $urlEncode = false)
    {
        $buff = "";
        ksort($paraMap);
        foreach ($paraMap as $k => $v) {
            if (null != $v && "null" != $v) {
                if ($urlEncode) {
                    $v = urlencode($v);
                }
                $buff .= $k . "=" . $v . "&";
            }
        }
        $reqPar = '';
        if (strlen($buff) > 0) {
            $reqPar = substr($buff, 0, strlen($buff) - 1);
        }
        return $reqPar;
    }
}

若有侵权,请联系博主删帖处理

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值