不败君

前端萌新&初级后端攻城狮

PHP开发微信支付功能

发表:2019-08-05 01:02:59

围观(263)

记录下之前负责的一个项目写过的微信支付(为了以后需要 方便Copy)

public function index()
{
    //支付数据
    $data['out_trade_no'] = date('YmdHis') . rand(100, 999);
    $data['total_fee'] = 10;	//此处的值需要是实际金额 * 100
    $data['spbill_create_ip'] = $_SERVER["REMOTE_ADDR"];
    $data['attach'] = '可以附带的信息';
    $data['body'] = '产品信息';
    $data['appid'] = 'APPID';
    $data['mch_id'] = 'MCHID';
    $data['nonce_str'] = md5(time() . rand(0, 999));
    $data['trade_type'] = 'NATIVE';	//支付方式
    $data['notify_url'] = 'https://bubaijun.com/notify_url';	//异步回调地址

    $sign = $this->getParam($data);
    $dataXML = "<xml>
        <appid>".$data['appid']."</appid>
        <attach>".$data['attach']."</attach>
        <body>".$data['body']."</body>
        <mch_id>".$data['mch_id']."</mch_id>
        <nonce_str>".$data['nonce_str']."</nonce_str>
        <notify_url>".$data['notify_url']."</notify_url>
        <out_trade_no>".$data['out_trade_no']."</out_trade_no>
        <spbill_create_ip>".$data['spbill_create_ip']."</spbill_create_ip>
        <total_fee>".$data['total_fee']."</total_fee>
        <trade_type>".$data['trade_type']."</trade_type>
        <sign>".$sign."</sign>
    </xml>";

    $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';

    //发起HTTP请求 因为用的是 Laravel 框架,所以可以使用GuzzleHttp类
    $http = new GuzzleHttp\Client;
    $response = $http->request('POST', $url, ['body' => $dataXML]);
    $pay_res = $this->xmlToArray($response->getBody());        
    if($pay_res['return_code'] == 'SUCCESS' && $pay_res['return_msg'] == 'OK') {
        //调起支付并成功返回数据
        //进行需要的业务逻辑
        //然后可以将 code_url 返回给视图并生成二维码
        //因为使用的支付方式是 NATIVE 所以将返回的 code_url 生成二维码后使用微信客户端扫码即可支付
    } else {
        //调起支付失败
        //返回失败信息
    }
}

private function getParam($paramArray, $isencode = false)
{
    $paramStr = '';
    ksort($paramArray);
    $i = 0;
    foreach($paramArray as $key => $value){
        if ($key == 'Signature'){
            continue;
        }
        if ($i == 0){
            $paramStr .= '';
        }else{
            $paramStr .= '&';
        }
        $paramStr .= $key . '=' . ($isencode ? urlencode($value) : $value);
        ++$i;
    }

    $key = '微信支付密钥 key';
    $stringSignTemp = $paramStr."&key={$key}";
    $sign = strtoupper(md5($stringSignTemp));
    return $sign;
}

private function xmlToArray($xml)
{
    libxml_disable_entity_loader(true);
    $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
    $val = json_decode(json_encode($xmlstring), true);
    return $val;
}

//支付异步回调,使用时记得给该方法写一条路由
public function notify(Request $request)
{
    //微信支付结果
    $data_xml = $request->getContent();
    if(!$data_xml){
        return response()->json([
            'status' => 400,
            'msg' => '请勿进行非法操作'
        ]);
    }
    $data = $this->xmlToArray($data_xml);
    if($data['return_code'] == 'SUCCESS' && $data['result_code'] == 'SUCCESS'){
        if($this->checksign($data)) {
            //订单号
            $out_trade_no   = $data['out_trade_no'];
            //金额 需要除以100 才能拿到实际付款金额
            $price = $data['total_fee'] / 100;
            //继续业务逻辑...
        }else{
            Log::info('微信支付返回结果签名验证失败:', $data);
        }
    }else{
        Log::info('微信支付错误:', $data);
    }
}

private function checksign(array $data)
{
    $str = '';
    ksort($data);
    foreach($data as $key => $val) {
        if($key != 'sign') $str .= $key.'='.$val.'&';
    }
    $key = '微信支付密钥 key';
    $temp = $str . "key={$key}";
    $sign = strtoupper(md5($temp));
    return $sign == $data['sign'] ? true : false;
}

当然 以上代码和实际项目中是有出入的,只是记录下来为了以后更好Copy,在实际项目中需要根据需求继续完善并写入业务逻辑。

本文地址 : www.bubaijun.com/page.php?id=129

版权声明 : 未经允许禁止转载!

评论:我要评论
发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语