在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 應用軟件教程 > 詳細頁面

微信小程序支付的流程問題解析(代碼解析)

微信小程序支付的流程問題解析(代碼解析)

更新時間:2025-09-24 文章作者:未知 信息來源:網絡 閱讀次數:

微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一...
微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一項門檻非常高的創新,經過將近兩年的發展,已經構造了新的小程序開發環境和開發者生態。
本篇文章給大家帶來的內容是關于微信小程序支付的流程問題解析(代碼解析),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

這幾天在做小程序的支付,沒有用官方的SDK,這里就純用官方的文檔搞一發。

* 注:使用的PHP,不過支付流程都是這樣

開發前必讀

主要流程

  • 小程序前端發送求參請求

  • 接受請求封裝 “統一下單” 獲取package

  • 小程序接受 “統一下單” 獲取的package值帶入wx.requestPayment發起支付請求

準備工具

  • 申請小程序微信支付

  • 拿到小程序微信支付的商戶號及設置秘鑰

注意:小程序就只需要這兩步,如果是web的話還需要設置支付目錄授權域名,文檔里面也有寫的:https://pay.weixin.qq.com/wik..

統一下單

官方文檔:https://pay.weixin.qq.com/wik...
/**
 * 統一訂單
 */
public function unifiedorder(){
    // 以下配置是必填項,如有其它需求請自行配置
    $config = array(
        'appid'         =>    'xxxxxxx',//這里是小程序appid
        'mch_id'        =>    'xxxxxxx',//商戶ID
        'nonce_str'     =>    $this->getNonceStr(),//隨機字符串
        'body'          =>    '這里是測試 - 測試',//請按照文檔要求填寫合格名稱
        'out_trade_no'  =>    time().$this->getNonceStr(2),//流水單號
        'total_fee'     =>    '20',//金額,分為單位,這里是0.2元
        'spbill_create_ip' => '123.123.123.123',//當前IP
        'notify_url'    =>    'http://xxxx.com',//請恕我愚昧,我沒搞懂他有什么用
        'trade_type'    =>    'JSAPI',//必須填寫JSAPI
        'openid'        =>    'xxxxxxxx'//當前用戶的openid,在trade_type=JSAPI的時候,此項就變成必填項了
    );
    $config['sign'] = $this->getSignPay($config);
    $xmlData = $this->ToXml($config);//轉成xml數據
    $postData = $this->http_post($xmlData);
    $arrayData = $this->FromXml($postData);
    if($arrayData['return_code'] == 'SUCCESS' || $arrayData['result_code'] == 'SUCCESS'){
        return $arrayData['prepay_id'];//重點來了:走了這么多路,就為了這個值。到這一步就證明成功一多半了。
    }else{
        return $arrayData;//返回錯誤
    }
}

/**
 * 獲取簽名
 */
public function getSignPay($config){
    $key = 'xxxxxxx';//商戶秘鑰,就是自己生成的32位密碼
    $strA = 'appid='.$config['appid'].'&body='.$config['body'].'&mch_id='.$config['mch_id'].'&nonce_str='.$config['nonce_str'].'&notify_url='.$config['notify_url'].'&spbill_create_ip'.$config['spbill_create_ip'].'&total_fee='.$config['total_fee'].'&trade_type='.$config['trade_type'];//ASCII 字典序
    $strB = $strA.'&key='.$key;
    $sign = strtoupper(md5($strB));//大寫MD5
    return $sign;
}

/**
 * 隨機字符串 32位
 */
public function getNonceStr($length = 32){
    $chars = "abcdefghijklmnopqrstuvwxyz0123456789";  
    $str ="";
    for ( $i = 0; $i < $length; $i++ )  {  
        $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);  
    } 
    return $str;
}

/**
 * array轉XML
 */
public function ToXml($data){
    if(!is_array($data) || count($data) <= 0){
        throw new WxPayException("數組數據異常!");
    }
    $xml = "<xml>";
    foreach ($data as $key=>$val){
        $xml.="<".$key.">".$val."</".$key.">";
    }
    $xml.="</xml>";
    return $xml; 
}

/**
 * xml轉array
 */
public function FromXml($xml){    
    if(!$xml){
        throw new WxPayException("xml數據異常!");
    }
    libxml_disable_entity_loader(true);
    $this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    return $this->values;
}


/**
 * post 請求
 */
public function http_post($url,$param,$post_file=false){
    $oCurl = curl_init();
    if(stripos($url,"https://")!==FALSE){
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
    }
    if (PHP_VERSION_ID >= 50500 && class_exists('\CURLFile')) {
        $is_curlFile = true;
    } else {
        $is_curlFile = false;
        if (defined('CURLOPT_SAFE_UPLOAD')) {
            curl_setopt($oCurl, CURLOPT_SAFE_UPLOAD, false);
        }
    }
    if (is_string($param)) {
        $strPOST = $param;
    }elseif($post_file) {
        if($is_curlFile) {
            foreach ($param as $key => $val) {
                if (substr($val, 0, 1) == '@') {

                }
            }
        }
        $strPOST = $param;
    } else {
        $aPOST = array();
        foreach($param as $key=>$val){
            $aPOST[] = $key."=".urlencode($val);
        }
        $strPOST =  join("&", $aPOST);
    }
    curl_setopt($oCurl, CURLOPT_URL, $url);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt($oCurl, CURLOPT_POST,true);
    curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);
    $sContent = curl_exec($oCurl);
    $aStatus = curl_getinfo($oCurl);
    curl_close($oCurl);
    if(intval($aStatus["http_code"])==200){
        return $sContent;
    }else{
        return false;
    }
}

好了現在已經獲取到了 prepay_id 的值,我們的統一下單就算完成了,其實我更樂意叫他數據封

小程序微信支付

官方文檔:https://developers.weixin.qq....

先來一個插曲,首先我們小程序的前端需要去觸發pay,實現的功能肯定是要點擊小程序的一個觸發,然后才能支付對吧,

pay:function(e){
    //這里面使用post去請求。然后通過我接下來要寫的API支付代碼獲取小程序支付參數
    success:function(res){
         wx.requestPayment({
             'timeStamp':toString(res.timeStamp),//這里轉字符串,這里被坑過,不轉的話可能會出現total_fee為空
             'nonceStr':toString(res.nonceStr),
             'package':toString(res.package),
             'signType':'MD5',
             'paySign':toString(res.paySign),
             success:function(res){
                 console.log(res);//這里可以跳轉到帶參地址
             },
             fail:function(res){
                 console.info('支付失敗',res);
             },
             complete:function(){
                 console.info('支付觸發回調',res);
             }
         })  
    }
       
}

api支付

也就是上面小程序代碼的后端請求地址

/**
 * api組裝數據
 */
public function payApiBlack(){
    $appid = 'xxxxxx';//小程序appid,上面有重復,不過這樣比較直觀
    $timeStamp = time();
    $nonceStr = $this->getNonceStr();//這是調用統一下單里面的方法,為了直觀,我把這些代碼都寫在了一個類里
    $package = 'prepay_id='.$this->unifiedorder();
    $signType = 'MD5';
    $key = 'xxxxxx';//這里是商戶秘鑰,32位,同上面也有
    $strA = 'appId='.$appid.'&nonceStr='.$nonceStr.'package='.$package.'&= signType='.$signType.'&timeStamp='.$timeStamp.'&key='.$key;
    $paySign = strtoupper(md5($strA));
    $data = array(
        'appid'=>$appid,
        'timeStamp'=>$timeStamp,
        'nonceStr'=>$nonceStr,
        'package'=>$package,
        'signType'=>$signType
    );
    return $data;//返回給小程序
}

以上就是全部代碼,還有小程序的支付回調沒有什么信息,所以,我的思路判斷success后進行跳轉帶參

//此代碼為wx.requestPayment success,部分代碼省略
//res 回調參數包括用戶uid及其他重要傳遞
success:function(res){
    wx.redirect({
        url:'pages/pay/done?uid='+res.uid
    })
}

當然那個統一下單的 notify_url 好像與回調有關,至于怎么用,試了幾次回調的CURD都沒反應,所以有空再研究啦。

以上代碼僅作為支付流程解釋,所以真正要用到項目上,還是去套官方的SDK吧,畢竟涉及到錢嘛

相關推薦:

微信小程序和支付寶小程序對比區別介紹

微信小程序如何從0開始進入支付

微信小程序微信支付接入開發

以上就是微信小程序支付的流程問題解析(代碼解析)的詳細內容,更多請關注php中文網其它相關文章!


小程序是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或者搜一下即可打開應用。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 亚洲精品无码久久久久久| 香蕉视频xxx| 国产精品乱码久久久久| 黄色a级三级三级三级| 777久久精品一区二区三区无码 | 日日摸日日碰夜夜爽无码| 麻豆一区二区三区视频| 五十路熟女丰满大屁股 | 国自产拍偷拍精品啪啪一区二区| 中文字幕66页| 狠狠热免费视频| 欧美一区二区激情| 黄色污污在线观看| 精品91一区二区三区| 在线观看18视频网站| 五月婷婷丁香综合网| 免费看黄色一级大片| 亚洲 高清 成人 动漫| 人妻激情另类乱人伦人妻| 性久久久久久久久久久久久久| 日本不卡在线观看视频| 草草久久久无码国产专区| 日本阿v视频在线观看| 少妇一晚三次一区二区三区| 香蕉视频色在线观看| 手机精品视频在线| 日韩在线不卡一区| 视频一区二区视频| 人人妻人人澡人人爽欧美一区双| 中文字幕av导航| 水蜜桃色314在线观看| 日韩在线xxx| 久久久福利影院| 老司机激情视频| 免费无码国产v片在线观看| 午夜免费一区二区| 国内精品国产三级国产99| 一女被多男玩喷潮视频| 九色porny91| 日本一二三区视频在线| 国产一区亚洲二区三区| 国产欧美综合一区| 精品久久久久av| 久久亚洲a v| 伊人五月天婷婷| 日本www高清视频| 婷婷激情小说网| 亚洲综合色在线观看| 116极品美女午夜一级| 色偷偷中文字幕| 国产999免费视频| 丰满少妇在线观看| 欧美成人高潮一二区在线看| 天堂网成人在线| 亚洲国产午夜精品| 亚洲欧美日韩综合网| 99热这里只有精品在线播放| 日韩中文字幕二区| 蜜桃免费在线视频| www.国产视频.com| 羞羞的视频在线| 国产精品8888| 人妻久久久一区二区三区| av在线播放亚洲| av之家在线观看| 日韩一区二区三区久久| 搡的我好爽在线观看免费视频| 欧美日韩激情视频在线观看| 久久久精品在线视频| 色91精品久久久久久久久| 国产精品嫩草影视| 少妇av一区二区三区无码| 青青青在线视频播放| 免费裸体美女网站| 久久久久久久久影视| 亚洲精品中文字幕无码蜜桃| 中文字幕综合在线观看| 91视频最新入口| 亚洲最大成人在线观看| 在线观看成人免费| 日本成年人网址| 福利在线小视频| 久久精品国产精品亚洲精品色| 国产人妻777人伦精品hd| aaaaaaaa毛片| 午夜激情福利在线| 日av中文字幕| 欧美日韩亚洲第一| 久久久久久久9| 黄色成人在线免费观看| 精品国产三级a∨在线| 妓院一钑片免看黄大片| www.激情网| 成人国产一区二区三区| 韩国一区二区av| 99热成人精品热久久66| 免费看a级黄色片| 激情五月婷婷久久| 欧美一级裸体视频| 成人日韩在线视频| 欧美国产在线一区| 日韩精品一区二区在线视频| 日本黄网站色大片免费观看| 天天综合成人网| 成人一区二区av| 黄色高清无遮挡| 国产高清免费在线| 亚洲熟妇av日韩熟妇在线| 人人干人人视频| 国产欧美自拍视频| 人人妻人人添人人爽欧美一区| 男人揉女人奶房视频60分| 91极品视频在线观看| 五月天婷婷在线观看视频| 男人天堂网站在线| 国产原创精品在线| 国产一线二线三线女| 天天干天天爽天天射| 日韩黄色片在线| www.久久91| 亚洲精品高清无码视频| 欧美日韩福利在线| 毛片毛片毛片毛| 欧美日韩亚洲自拍| 男人添女人下面高潮视频| 亚洲黄色网址在线观看| 亚洲一级片网站| 欧美精品久久久久久久久25p| 300部国产真实乱| 7777在线视频| 粉嫩av一区二区三区天美传媒| 日本熟妇人妻中出| 91精品91久久久中77777老牛| 99精品一区二区三区的区别| 中文字幕第88页| 手机看片福利盒子久久| 无码内射中文字幕岛国片| 青青草原成人网| 亚洲熟妇av一区二区三区| 激情内射人妻1区2区3区| 国产成人精品视频ⅴa片软件竹菊| 97国产精东麻豆人妻电影| 男人和女人啪啪网站| 五月天婷婷激情视频| 性鲍视频在线观看| 成年人网站国产| 四虎永久在线精品无码视频| 亚洲欧洲日本精品| 欧美午夜性视频| 久草精品在线播放| 亚洲美女爱爱视频| 日韩一二区视频| 免费看毛片的网址| 女同性恋一区二区| 青青青青在线视频| caopor在线视频| 丰满人妻一区二区三区53号| 霍思燕三级露全乳照| 亚洲欧美在线精品| 69堂免费视频| 国产一级不卡视频| www.偷拍.com| 中文av字幕在线观看| 国产老熟妇精品观看| 国产乱子伦精品无码专区| www.四虎成人| 国产精品少妇在线视频| 国产福利视频在线播放| av影院在线播放| 日韩一二区视频| 欧美精品自拍视频| 亚洲熟妇无码另类久久久| 成人一区二区av| 99蜜桃臀久久久欧美精品网站| 欧美一区二区三区综合| 欧美日韩激情四射| 无码人妻丰满熟妇区毛片18| 国产第一页视频| 男人午夜视频在线观看| 菠萝蜜视频在线观看入口| 国产成人永久免费视频| 九九九在线观看视频| 国产无色aaa| 成人污网站在线观看| 欧美a级免费视频| 久久综合久久色| 佐佐木明希av| 麻豆av免费在线| 性欧美18一19内谢| 精品免费国产一区二区| 伊人再见免费在线观看高清版 | 日韩视频 中文字幕| 亚洲一区二区蜜桃| 国产综合免费视频| 精品日韩在线播放| 久久精品在线免费视频| 中文字幕亚洲影院| 黄色一级片免费的| 久久免费看毛片| 男女激情无遮挡|