在线看毛片视频-国产免费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>
  • 8x8x成人免费视频| 欧美aaa在线观看| 激情小视频网站| 97人人爽人人| 一级在线免费视频| 香蕉视频网站入口| 国产一级片黄色| 色综合av综合无码综合网站| 欧美一区二区三区爽大粗免费| 中国丰满熟妇xxxx性| 国产人妻互换一区二区| 99热都是精品| 国产精品久久..4399| 成人免费视频91| 免费在线观看毛片网站| 欧美一级特黄a| 在线观看日本www| 国产黄色激情视频| 99999精品视频| 天天干天天干天天干天天干天天干| 日本在线观看a| 亚洲第一天堂久久| 亚洲av综合色区| 俄罗斯av网站| 在线观看国产一级片| 女同性恋一区二区| 18禁免费无码无遮挡不卡网站| 波多野结衣家庭教师视频| 鲁一鲁一鲁一鲁一av| 日本福利视频在线观看| 日韩一级在线免费观看| 日韩精品在线播放视频| 农民人伦一区二区三区| 亚欧在线免费观看| 大胆欧美熟妇xx| 无限资源日本好片| 日韩精品视频在线观看视频| 性生交免费视频| 色婷婷777777仙踪林| 九热视频在线观看| 精品少妇在线视频| 一级做a免费视频| www国产黄色| 小泽玛利亚av在线| 中文字幕第21页| 欧美亚洲黄色片| 特黄特黄一级片| 日韩精品你懂的| 黄色免费观看视频网站| 2022中文字幕| 亚洲第一精品区| 蜜桃免费在线视频| 日本欧美黄色片| 日韩免费在线观看av| 日本成人性视频| 午夜激情av在线| 久久久久久香蕉| 日本福利视频在线| av在线播放天堂| 日韩国产小视频| 伊人再见免费在线观看高清版| 污污视频网站在线| 日韩欧美国产片| 黄色片在线免费| 毛片av免费在线观看| 成人免费观看视频在线观看| 亚洲色成人www永久在线观看| 浴室偷拍美女洗澡456在线| 免费在线观看污网站| 成年网站免费在线观看| 热久久久久久久久| 一级片免费在线观看视频| 超碰中文字幕在线观看| 三年中文高清在线观看第6集| 日本三级福利片| 99re6这里有精品热视频| 永久免费看av| 福利视频一二区| 可以免费在线看黄的网站| 免费在线观看毛片网站| 欧美成人黄色网址| 国产探花在线观看视频| 欧美三级午夜理伦三级老人| 草b视频在线观看| 波多野结衣家庭教师在线| 日本成人中文字幕在线| 可以看污的网站| 蜜臀av.com| 男人插女人视频在线观看| 亚洲五月天综合| 中文字幕综合在线观看| 国产精品日韩三级| 色综合av综合无码综合网站| 第四色婷婷基地| 日本大胆人体视频| 日本www在线视频| 91av视频免费观看| 日韩黄色短视频| 色91精品久久久久久久久| 国产美女在线一区| 亚洲一二三区av| 国产成a人亚洲精v品在线观看| 日韩精品免费播放| a级片一区二区| 男女视频在线看| 欧美,日韩,国产在线| 国产又粗又长又爽又黄的视频| 久久久久久久久久网| 日本一二三四区视频| 久久精品香蕉视频| 黄色激情在线视频| 色噜噜狠狠一区二区三区狼国成人| 免费在线观看视频a| 久久久一二三四| 天堂一区在线观看| a√天堂在线观看| 国产黄色激情视频| 992kp免费看片| 中文字幕亚洲欧洲| 六月丁香婷婷激情| 成人性生活视频免费看| 欧美xxxxxbbbbb| 亚洲图色中文字幕| 一道本视频在线观看| 黑鬼大战白妞高潮喷白浆| 成人免费播放器| 精品久久久久久无码中文野结衣 | 丁香色欲久久久久久综合网| 成人毛片视频网站| 久在线观看视频| 成人黄色av片| 亚洲国产精品无码av| 草b视频在线观看| 奇米影视亚洲色图| 激情深爱综合网| 男人天堂1024| 欧美私人情侣网站| 激情婷婷综合网| 污视频免费在线观看网站| 国产精品无码一本二本三本色| 国产精品宾馆在线精品酒店| 日本久久久精品视频| 国产午夜福利视频在线观看| 日本www高清视频| 91香蕉视频导航| 中文字幕剧情在线观看| 欧洲美女和动交zoz0z| 欧美国产视频一区| 美女福利视频在线| 538在线视频观看| 三年中文高清在线观看第6集| 国产高清精品软男同| www.在线观看av| 成人免费无码av| 在线免费黄色网| 日b视频免费观看| 日韩中文字幕二区| 午夜精品久久久久久久99热影院| 最近免费观看高清韩国日本大全| 中国丰满熟妇xxxx性| 欧美日韩亚洲一二三| 国产av不卡一区二区| 国产97在线 | 亚洲| www.污网站| 777av视频| 91大神免费观看| 北条麻妃在线视频观看| 亚洲精品第三页| 国产一区二区三区精彩视频| 91大神免费观看| 岳毛多又紧做起爽| 美女在线免费视频| 熟妇人妻无乱码中文字幕真矢织江 | 欧美日韩在线中文| 99中文字幕在线| 久久久噜噜噜www成人网| 日韩视频在线免费播放| 国产精品无码av无码| 国产av熟女一区二区三区| www.com操| 国产超级av在线| 久久手机在线视频| 91香蕉视频在线观看视频| 999香蕉视频| 黄色大片在线免费看| 天天综合五月天| 天天色天天干天天色| 日本xxxx黄色| 欧美精品成人网| 成人久久久久久久久| 日韩网站在线免费观看| 欧美做受777cos| 中文字幕在线乱| 中文字幕av导航| 中文字幕一区二区三区四| www.夜夜爽| 肉色超薄丝袜脚交| 九九热99视频| 久久婷五月综合| 国产精品探花在线播放|