1. 程式人生 > >php微信掃碼支付

php微信掃碼支付

b2c blank func blog ransac tro .net -h h5支付

一 概述

掃碼支付是商戶系統按微信支付協議生成支付二維碼,用戶再用微信“掃一掃”完成支付的模式。該模式適用於PC網站支付、實體店單品或訂單支付、媒體廣告支付等場景。前幾天公司需要做了一下掃碼支付 分享一下

首先需要準備的東西

微信給的 appid, mchtd(商戶號) ,key ,appsecret

下載微信的sdk

配置 appid mchtd key 和 appsecret

新建文件 barcodepay.php //命名方式 根據自己的習慣

引入 lib/WxPay.Api.php example/WxPay.NativePay.php /example/log.php

我把這個做成了一個函數 這樣方便引用 如果大神有不同的看法可以告知我哦

function barcodepay($body,$attch,$fee,$tag,$url,$proid){
    $nofity = new NativePay();
    $input = new WxPayUnifiedOrder();
    $input->SetBody($body);
    $input->SetAttach($attch);
    $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
    $input->SetTotal_fee($fee);
    
$input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag($tag); $input->SetNotify_url($url); $input->SetTrade_type("NATIVE"); $input->SetProduct_id($proid); $result = $nofity->GetPayUrl($input); $pay_img_url
= $result[‘code_url‘]; $pay_url_img = ‘http://paysdk.weixin.qq.com/example/qrcode.php?data=‘.urlencode($pay_img_url); return $pay_url_img; }

此處的

$body 是收款標題如

技術分享圖片

$attch 附加數據

$fee 是多少錢 此處需註意 微信是按分計算的 付款一分就是 1

$tag 標記

$url 支付成功後通知地址

$proid 商品訂單號

還可以加上別的東西 詳情請看https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1 微信api列表

這樣調用的時候直接調用barcodepay這個函數就可以

調用barcodepay();會返回一個地址

可以用ajax的方式寫入圖片路徑 也可以用 <img src="<?php echo barcodepay ?>">

現在掃碼即可付款了 支付成功是第一步 支付成功了二維碼頁面也不會有任何顯示的 因為騰訊服務器是異步發送給你的通知

現在就需要編寫回調函數了

我的方法如下

打開exmaple/notify.php

代碼如下

<?php
ini_set(‘date.timezone‘,‘Asia/Shanghai‘);
error_reporting(E_ERROR);

require_once "../lib/WxPay.Api.php";
require_once ‘../lib/WxPay.Notify.php‘;
require_once ‘log.php‘;

//初始化日誌
$logHandler= new CLogFileHandler("../logs/".date(‘Y-m-d‘).‘.log‘);
$log = Log::Init($logHandler, 15);

class PayNotifyCallBack extends WxPayNotify
{
    //查詢訂單
    public function Queryorder($transaction_id)
    {
        $input = new WxPayOrderQuery();
        $input->SetTransaction_id($transaction_id);
        $result = WxPayApi::orderQuery($input);
        Log::DEBUG("query:" . json_encode($result));
        if(array_key_exists("return_code", $result)
            && array_key_exists("result_code", $result)
            && $result["return_code"] == "SUCCESS"
            && $result["result_code"] == "SUCCESS")
        {
            return true;
        }
        return false;
    }
    
    //重寫回調處理函數
    public function NotifyProcess($data, &$msg)
    {
        Log::DEBUG("call back:" . json_encode($data));
        $notfiyOutput = array();
        
        if(!array_key_exists("transaction_id", $data)){
            $msg = "輸入參數不正確";
            return false;
        }
        //查詢訂單,判斷訂單真實性
        if(!$this->Queryorder($data["transaction_id"])){
            $msg = "訂單查詢失敗";
            return false;
        }
        
        //<strong>在這裏編寫需要的操作 比如 改變支付狀態為支付成功</strong>
        return true;
    }
}

Log::DEBUG("begin notify");
$notify = new PayNotifyCallBack();
$notify->Handle(false);

之後在頁面編寫ajax 三秒查詢一次 每三秒執行一次在這裏我就省略了 實際情況是需要的

function ajaxstatus(){
    $.ajax({
        type:‘get‘,
        url:‘你的接口地址‘,
        data:{‘查詢數據的條件‘},
        dataType:‘json‘,
        success:function(data){
            if(data.data.success == 3){
                //此處可以進行成功操作
                //延時三秒
                setTimeout("location.href=‘支付成功的跳轉頁面‘",3000); 
                
            }
        }
    })
}

關於支付成功後ajax請求的php接口在這裏就不寫了
到這裏微信掃碼支付就結束了

需要註意的是

文件引入路徑 和文件與文件直接的路徑問題

解決方法 修改路徑即可

服務器時間與本地時間 或者是 這個php系統設定的時間 如果不相符會出現

time_expire時間過短,刷卡至少1分鐘,其他5分鐘

解決方法 檢查修改時間

以上程序本人親測可以運行

有問題可以留言我哦 或者對上面有不同的看法也可以留言哦

有時間會寫一下微信h5支付(wap)和微信刷卡支付

php微信掃碼支付