久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

重新對百度支付進行編寫封裝(百度智能小程序支付)

最近因為項目重構的原因,對百度支付重新進行了編寫封裝,本次重寫,添加了對簽名的處理、添加用戶退款,方便之后開發的使用。

因為百度電商開放平臺的升級,支付功能已移至智能小程序內部,具體申請流程:百度收銀臺支付開通指引,(https://smartprogram.baidu.com/docs/operations/transform/pay/)

(注:在支付服務中,服務電話應填寫銀行預留手機號,如填寫錯誤報【銀行預留手機號碼格式校驗不通過】)

百度支付文檔:百度收銀臺接口2.0(https://smartprogram.baidu.com/docs/develop/function/tune_up_2.0/)

一、申請通過后,填寫百度支付相關配置:

$config = array(     'deal_id'       => '', // 百度收銀臺的財務結算憑證     'app_key'       => '', // 表示應用身份的唯一ID     'private_key'   => '', // 私鑰原始字符串     'public_key'    => '', // 平臺公鑰     'notify_url'    => '', // 支付回調地址 );

二、調用封裝的支付方法,將返回信息,傳遞到百度小程序

<?php include './BaiduPay.php'; $baidupay = new fengBaiduPay($config); $order_sn = time().rand(1000,9999); $order = array(     'body'          => '測試商品', // 產品描述     'total_amount'  => '1', // 訂單金額(分)     'order_sn'      => $order_sn, // 訂單編號 ); $re = $baidupay->xcxPay($order); die(json_encode($re)); // JSON化直接返回小程序客戶端 PHP

小程序支付類 xcxPay:

/**  * [xcxPay 百度小程序支付]  * @param  [type]  $order [訂單信息數組]  * @return [type]         [description]  * $order = array(  *      'body'          => '', // 產品描述  *      'total_amount'  => '', // 訂單金額(分)  *      'order_sn'      => '', // 訂單編號  * );  */ public static function xcxPay($order) {     if(!is_array($order) || count($order) < 3)         die("數組數據信息缺失!");     $config = self::$config;     $requestParamsArr = array(         'appKey'    => $config['app_key'],         'dealId'    => $config['deal_id'],         'tpOrderId' => $order['order_sn'],         'totalAmount' => $order['total_amount'],     );     $rsaSign = self::makeSign($requestParamsArr, $config['private_key']);  // 聲稱百度支付簽名     $bizInfo = array(         'tpData' => array(             "appKey"        => $config['app_key'],             "dealId"        => $config['deal_id'],             "tpOrderId"     => $order['order_sn'],             "rsaSign"       => $rsaSign,             "totalAmount"   => $order['total_amount'],             "returnData"    => '',             "displayData"   => array(                 "cashierTopBlock" => array(                     array(                         [ "leftCol" => "訂單名稱", "rightCol"   => $order['body'] ],                         [ "leftCol" => "數量", "rightCol" => "1" ],                         [ "leftCol" => "訂單金額", "rightCol"   => $order['total_amount'] ]                     ),                     array(                         [ "leftCol" => "服務地址", "rightCol" => "北京市海淀區上地十街10號百度大廈" ],                         [ "leftCol" => "服務時間", "rightCol" => "2018/10/29 14:51" ],                         [ "leftCol" => "服務人員", "rightCol" => "百度App" ]                     )                 )             ),             "dealTitle"     => $order['body'],             "dealSubTitle"  => $order['body'],             "dealThumbView" => "https://b.bdstatic.com/searchbox/icms/searchbox/img/swan-logo.png",         ),         "orderDetailData"   => ''     );     $bdOrder = array(         'dealId'        => $config['deal_id'],         'appKey'        => $config['app_key'],         'totalAmount'   => $order['total_amount'],         'tpOrderId'     => $order['order_sn'],         'dealTitle'     => $order['body'],         'signFieldsRange' => 1,         'rsaSign'       => $rsaSign,         'bizInfo'       => json_encode($bizInfo),     );     return $bdOrder; }

三、百度智能小程序端的使用

SWAN

<view class="wrap">     <view class="card-area">         <button bind:tap="requestPolymerPayment" type="primary" hover-stop-propagation="true">支付0.01元</button>     </view> </view> HTML

JS

Page({     requestPolymerPayment(e) {         swan.request({             url: 'https://mbd.baidu.com/xxx', // 僅為示例,并非真實的接口地址,開發者從真實接口獲取orderInfo的值             success: res => {                 res.data.data.dealTitle = '百度小程序Demo支付測試';                 let data = res.data;                 if (data.errno !== 0) {                     console.log('create order err', data);                     return;                 }                 swan.requestPolymerPayment({                     orderInfo: data.data,                     success: res => {                         swan.showToast({                             title: '支付成功',                             icon: 'success'                         });                         console.log('pay success', res);                     },                     fail: err => {                         swan.showToast({                             title: err.errMsg,                             icon: 'none'                         });                         console.log('pay fail', err);                     }                 });             },             fail: err => {                 swan.showToast({                     title: '訂單創建失敗',                     icon: 'none'                 });                 console.log('create order fail', err);             }         });     } });

四、支付回調

<?php include './BaiduPay.php'; $baidupay = new fengBaiduPay($config); $re = $baidupay->notify(); if ($re) {     // 這里回調處理訂單操作     // 以驗證返回支付成功后的信息,可直接對訂單進行操作,已通知微信支付成功     $baidupay->success(); // 支付返還成功,通知結果 } else {     // 支付失敗     $baidupay->error(); // 支付失敗,返回狀態(無論支付成功與否都需要通知百度) }

百度完整支付類(BaiduPay.php),包含小程序支付、驗簽、回調、退款:

<?php /**  * @Author: [FENG] <1161634940@qq.com>  * @Date:   2020-09-27T16:28:31+08:00  * @Last Modified by:   [FENG] <1161634940@qq.com>  * @Last Modified time: 2020-10-15T10:23:07+08:00  */ namespace feng; class BaiduPay {     private static $config = array(         'deal_id'       => '', // 百度收銀臺的財務結算憑證         'app_key'       => '', // 表示應用身份的唯一ID         'private_key'   => '', // 私鑰原始字符串         'public_key'    => '', // 平臺公鑰         'notify_url'    => '', // 支付回調地址     );     /**      * [__construct 構造函數]      * @param [type] $config [傳遞支付相關配置]      */     public function __construct($config=NULL){         $config && self::$config = $config;     }     /**      * [xcxPay 百度小程序支付]      * @param  [type]  $order [訂單信息數組]      * @return [type]         [description]      * $order = array(      *      'body'          => '', // 產品描述      *      'total_amount'  => '', // 訂單金額(分)      *      'order_sn'      => '', // 訂單編號      * );      */     public static function xcxPay($order)     {         if(!is_array($order) || count($order) < 3)             die("數組數據信息缺失!");         $config = self::$config;         $requestParamsArr = array(             'appKey'    => $config['app_key'],             'dealId'    => $config['deal_id'],             'tpOrderId' => $order['order_sn'],             'totalAmount' => $order['total_amount'],         );         $rsaSign = self::makeSign($requestParamsArr, $config['private_key']);  // 聲稱百度支付簽名         $bizInfo = array(             'tpData' => array(                 "appKey"        => $config['app_key'],                 "dealId"        => $config['deal_id'],                 "tpOrderId"     => $order['order_sn'],                 "rsaSign"       => $rsaSign,                 "totalAmount"   => $order['total_amount'],                 "returnData"    => '',                 "displayData"   => array(                     "cashierTopBlock" => array(                         array(                             [ "leftCol" => "訂單名稱", "rightCol"   => $order['body'] ],                             [ "leftCol" => "數量", "rightCol" => "1" ],                             [ "leftCol" => "訂單金額", "rightCol"   => $order['total_amount'] ]                         ),                         array(                             [ "leftCol" => "服務地址", "rightCol" => "北京市海淀區上地十街10號百度大廈" ],                             [ "leftCol" => "服務時間", "rightCol" => "2018/10/29 14:51" ],                             [ "leftCol" => "服務人員", "rightCol" => "百度App" ]                         )                     )                 ),                 "dealTitle"     => $order['body'],                 "dealSubTitle"  => $order['body'],                 "dealThumbView" => "https://b.bdstatic.com/searchbox/icms/searchbox/img/swan-logo.png",             ),             "orderDetailData"   => ''         );         $bdOrder = array(             'dealId'        => $config['deal_id'],             'appKey'        => $config['app_key'],             'totalAmount'   => $order['total_amount'],             'tpOrderId'     => $order['order_sn'],             'dealTitle'     => $order['body'],             'signFieldsRange' => 1,             'rsaSign'       => $rsaSign,             'bizInfo'       => json_encode($bizInfo),         );         return $bdOrder;     }     /**      * [refund baidu支付退款]      * @param  [type] $order [訂單信息]      * @param  [type] $type  [退款類型]      * $order = array(      *      'body'          => '', // 退款原因      *      'total_amount'  => '', // 退款金額(分)      *      'order_sn'      => '', // 訂單編號      *      'access_token'  => '', // 獲取開發者服務權限說明      *      'order_id'      => '', // 百度收銀臺訂單 ID      *      'user_id'       => '', // 百度收銀臺用戶 id      * );      */     public static function refund($order=[], $type=1)     {         $config = self::$config;         $data = array(             'access_token'      => $order['access_token'], // 獲取開發者服務權限說明             'applyRefundMoney'  => $order['total_amount'], // 退款金額,單位:分。             'bizRefundBatchId'  => $order['order_sn'], // 開發者退款批次             'isSkipAudit'       => 1, // 是否跳過審核,不需要百度請求開發者退款審核請傳 1,默認為0; 0:不跳過開發者業務方審核;1:跳過開發者業務方審核。             'orderId'           => $order['order_id'], // 百度收銀臺訂單 ID             'refundReason'      => $order['body'], // 退款原因             'refundType'        => $type, // 退款類型 1:用戶發起退款;2:開發者業務方客服退款;3:開發者服務異常退款。             'tpOrderId'         => $order['order_sn'], // 開發者訂單 ID             'userId'            => $order['user_id'], // 百度收銀臺用戶 id         );         $array = ['errno'=>0, 'msg'=>'success', 'data'=> ['isConsumed'=>2] ];         $url = 'https://openapi.baidu.com/rest/2.0/smartapp/pay/paymentservice/applyOrderRefund';         $response = self::post_curl($url, $data);         $result = json_decode($response, true);         // // 顯示錯誤信息         // if ($result['msg']!='success') {         //     return false;         //     // die($result['msg']);         // }         return $result;     }     /**      * [notify 回調驗證]      * @return [array] [返回數組格式的notify數據]      */     public static function notify()     {         $data = $_POST; // 獲取xml         $config = self::$config;         if (!$data || empty($data['rsaSign']))             die('暫無回調信息');         $result = self::checkSign($data, $config['public_key']); // 進行簽名驗證         // 判斷簽名是否正確  判斷支付狀態         if ($result && $data['status']==2) {             return $data;         } else {             return false;         }     }     /**      * [success 通知支付狀態]      */     public static function success()     {         $array = ['errno'=>0, 'msg'=>'success', 'data'=> ['isConsumed'=>2] ];         die(json_encode($array));     }     /**      * [error 通知支付狀態]      */     public static function error()     {         $array = ['errno'=>0, 'msg'=>'success', 'data'=> ['isErrorOrder'=>1, 'isConsumed'=>2] ];         die(json_encode($array));     }     /**      * [makeSign 使用私鑰生成簽名字符串]      * @param  array  $assocArr     [入參數組]      * @param  [type] $rsaPriKeyStr [私鑰原始字符串,不含PEM格式前后綴]      * @return [type]               [簽名結果字符串]      */     public static function makeSign(array $assocArr, $rsaPriKeyStr)     {         $sign = '';         if (empty($rsaPriKeyStr) || empty($assocArr)) {             return $sign;         }         if (!function_exists('openssl_pkey_get_private') || !function_exists('openssl_sign')) {             throw new Exception("openssl擴展不存在");         }         $rsaPriKeyPem = self::convertRSAKeyStr2Pem($rsaPriKeyStr, 1);         $priKey = openssl_pkey_get_private($rsaPriKeyPem);         if (isset($assocArr['sign'])) {             unset($assocArr['sign']);         }         ksort($assocArr); // 參數按字典順序排序         $parts = array();         foreach ($assocArr as $k => $v) {             $parts[] = $k . '=' . $v;         }         $str = implode('&', $parts);         openssl_sign($str, $sign, $priKey);         openssl_free_key($priKey);         return base64_encode($sign);     }     /**      * [checkSign 使用公鑰校驗簽名]      * @param  array  $assocArr     [入參數據,簽名屬性名固定為rsaSign]      * @param  [type] $rsaPubKeyStr [公鑰原始字符串,不含PEM格式前后綴]      * @return [type]               [驗簽通過|false 驗簽不通過]      */     public static function checkSign(array $assocArr, $rsaPubKeyStr)     {         if (!isset($assocArr['rsaSign']) || empty($assocArr) || empty($rsaPubKeyStr)) {             return false;         }         if (!function_exists('openssl_pkey_get_public') || !function_exists('openssl_verify')) {             throw new Exception("openssl擴展不存在");         }         $sign = $assocArr['rsaSign'];         unset($assocArr['rsaSign']);         if (empty($assocArr)) {             return false;         }         ksort($assocArr); // 參數按字典順序排序         $parts = array();         foreach ($assocArr as $k => $v) {             $parts[] = $k . '=' . $v;         }         $str = implode('&', $parts);         $sign = base64_decode($sign);         $rsaPubKeyPem = self::convertRSAKeyStr2Pem($rsaPubKeyStr);         $pubKey = openssl_pkey_get_public($rsaPubKeyPem);         $result = (bool)openssl_verify($str, $sign, $pubKey);         openssl_free_key($pubKey);         return $result;     }     /**      * [convertRSAKeyStr2Pem 將密鑰由字符串(不換行)轉為PEM格式]      * @param  [type]  $rsaKeyStr [原始密鑰字符串]      * @param  integer $keyType   [0 公鑰|1 私鑰,默認0]      * @return [type]             [PEM格式密鑰]      */     public static function convertRSAKeyStr2Pem($rsaKeyStr, $keyType = 0)     {         $pemWidth = 64;         $rsaKeyPem = '';         $begin = '-----BEGIN ';         $end = '-----END ';         $key = ' KEY-----';         $type = $keyType ? 'RSA PRIVATE' : 'PUBLIC';         $keyPrefix = $begin . $type . $key;         $keySuffix = $end . $type . $key;         $rsaKeyPem .= $keyPrefix . "n";         $rsaKeyPem .= wordwrap($rsaKeyStr, $pemWidth, "n", true) . "n";         $rsaKeyPem .= $keySuffix;         if (!function_exists('openssl_pkey_get_public') || !function_exists('openssl_pkey_get_private')) {             return false;         }         if ($keyType == 0 && false == openssl_pkey_get_public($rsaKeyPem)) {             return false;         }         if ($keyType == 1 && false == openssl_pkey_get_private($rsaKeyPem)) {             return false;         }         return $rsaKeyPem;     }     /**      * curl post請求      * @param string $url 地址      * @param string $postData 數據      * @param array $header 頭部      * @return bool|string      * @Date 2020/9/17 17:12      * @Author wzb      */     public static function post_curl($url='',$postData='',$header=[]){         $ch = curl_init($url);         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);         curl_setopt($ch, CURLOPT_POST, 1);         curl_setopt($ch, CURLOPT_HEADER, false);         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5000);         curl_setopt($ch, CURLOPT_TIMEOUT, 5000);         if($header){             curl_setopt($ch, CURLOPT_HTTPHEADER,$header);         }         curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);         $result = curl_exec($ch);         $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);         $curlErrNo = curl_errno($ch);         $curlErr = curl_error($ch);         curl_close($ch);         return $result;     } }

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
欧洲av不卡| 国产美女视频一区二区| 黄色网一区二区| 国产精品密蕾丝视频下载| 欧美日韩调教| 国产精品亚洲综合久久| 欧美伊人久久| 国产精品久久久久av蜜臀| 麻豆精品新av中文字幕| 91成人小视频| 日韩高清不卡一区二区| 色狠狠一区二区三区| 亚洲不卡视频| 国产亚洲久久| 国产精品1区在线| 久久一区精品| 日韩欧美国产精品综合嫩v| 成人日韩在线| 欧美日韩精品免费观看视频完整| 午夜精品网站| 亚洲人成亚洲精品| 91精品美女| 国内一区二区三区| 日韩电影免费网站| 免费久久精品| 蜜桃伊人久久| 亚洲欧洲美洲国产香蕉| 欧美三区不卡| 9999国产精品| 欧美特黄视频| 欧美日韩伊人| 亚洲国产福利| 在线视频日韩| 国产日本精品| av资源中文在线| 亚洲欧美激情诱惑| 国产九一精品| 秋霞影视一区二区三区| 亚洲欧美视频一区二区三区| 欧美在线日韩| 国际精品欧美精品| 国产一区成人| 免费看久久久| 蜜桃国内精品久久久久软件9| 日韩在线一区二区| 国产精品日本一区二区三区在线| 蜜桃av在线播放| 亚洲另类av| 国产精品久久久久久久久免费高清| 日韩av在线播放网址| 日韩一级精品| 国产精品日本一区二区三区在线 | 老司机免费视频一区二区三区| 天堂av在线| 亚洲久久一区| 日韩国产欧美一区二区| 亚洲一区av| 久久久久久一区二区| 日韩影院在线观看| 粉嫩av一区二区三区四区五区 | 麻豆精品视频在线观看视频| 欧美一级精品| 国产日产一区| 免费av一区二区三区四区| 你懂的亚洲视频| 日韩一区二区免费看| 另类欧美日韩国产在线| 午夜在线观看免费一区| 精品国产精品国产偷麻豆| 视频一区二区三区中文字幕| 精品99在线| 亚洲精品福利| 成人精品天堂一区二区三区| 国产精品视频一区视频二区| 99国产精品99久久久久久粉嫩| 精品国产三区在线| 亚洲精品欧美| 91精品国产91久久久久久黑人| 日韩av一区二区三区| 亚洲福利国产| 国产一区二区色噜噜| 国产精品最新自拍| 欧美日韩国产在线观看网站| 美女久久99| 四虎国产精品免费久久| 91精品啪在线观看国产18| 欧美91在线| 亚洲精品成人一区| 久久久久久美女精品| 国产精品亚洲片在线播放| 欧美日韩精品一本二本三本 | 国产一区二区精品久| 日韩精品免费视频一区二区三区| 国模 一区 二区 三区| 精品视频在线一区二区在线| 蜜臀va亚洲va欧美va天堂 | 天堂va在线高清一区| 亚洲视频综合| 精品久久电影| 国产精品一区二区精品视频观看| 蜜桃一区二区三区在线观看| 91精品一区二区三区综合在线爱 | 麻豆免费精品视频| 亚洲tv在线| 蜜乳av另类精品一区二区| 欧美亚洲在线日韩| 久久久久久夜| 精品视频在线你懂得| 日本午夜精品视频在线观看| 性欧美精品高清| 精品日韩毛片| 蜜桃tv一区二区三区| 欧美亚洲激情| 亚洲高清久久| 午夜免费一区| 黄色不卡一区| 在线精品视频在线观看高清| 欧美成人精品| 亚洲免费高清| 午夜av一区| 女人天堂亚洲aⅴ在线观看| 免费观看久久av| 国产专区一区| 欧美色图一区| 久久精品免费一区二区三区| 欧美日韩精品免费观看视完整| 国产一区二区三区不卡视频网站| 欧美国产专区| 欧美激情一区| 国产一区二区三区日韩精品| 久久久久久亚洲精品美女| 久久精品理论片| 成人在线免费观看网站| 麻豆91精品91久久久的内涵| 精品三级在线| 综合日韩av| 九九在线精品| 亚洲综合福利| 亚洲精品系列| 国产亚洲一区| 国产成人免费精品| 免费观看亚洲| 国产视频一区免费看| 在线免费观看亚洲| 久久蜜桃精品| 欧美精品一卡| 91日韩免费| 成人久久一区| 欧美一区二区三区激情视频 | 日韩精品一二区| 日韩激情精品| 亚洲精品护士| 国产精品1区| 岛国av在线网站| 一区三区视频| 日韩黄色av| 久久精品三级| 欧美99久久| 日韩一区二区三区在线看| 国产精品黄网站| 五月激情久久| 免费看日韩精品| 日韩不卡一区二区| 国产精品久久久久蜜臀| 精品中文字幕一区二区三区av| 亚洲欧美在线综合| 国产精品久久乐| 久久精品青草| 五月亚洲婷婷 | 岛国av在线播放| aⅴ色国产欧美| 国产日韩高清一区二区三区在线| av中文字幕在线观看第一页| 夜久久久久久| 国产日韩欧美三级| 久久久成人网| 亚州国产精品| 日韩欧美国产精品综合嫩v| 老牛国产精品一区的观看方式| 国产精品天堂蜜av在线播放| 99久久婷婷| 日韩av中文在线观看| 蜜桃精品在线| 午夜久久av| 久久高清精品| 国产午夜精品一区在线观看| 日本在线啊啊| 日本一区二区中文字幕| 日韩成人高清| 日韩中文字幕视频网| 亚洲精品88| 日本特黄久久久高潮| 婷婷精品视频| 久久99影视| 亚洲视频国产| 久久国产电影| 精品一区二区三区中文字幕在线| 99热免费精品| 在线看片国产福利你懂的| 亚洲乱码一区|