亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP小程序支付功能完整版【基于thinkPHP】

2024-05-05 00:07:59
字體:
來源:轉載
供稿:網友

本文實例講述了PHP小程序支付功能。分享給大家供大家參考,具體如下:

環境: tp3.2  + 小程序 微信支付功能開通

Step1:  下載PHP 支付SDK(下載地址)  放到Library/Vendor下,取名Wxpay

修改WxPay.Config.php 里的appid appsecret key MCHID

Step2: 小程序 js 代碼:

var url = getApp().globalData.httpServer + 'api/buy/pay';var userId = getApp().globalData.userId;var totalMoney = this.data.totalMoney;var cart = this.data.goods;var param = {  cart: JSON.stringify(cart),  cartamount: totalMoney,  userid: userId,  payment: this.data.payment,  addressid: defaultAddress.id};var that = this;util.http(url, param, function (ret) {  if (ret.data.code == 1) {    if (that.data.payment == 'balance') { // 余額支付      that.afterPaySuccess(ret.data.data);    } else {                // 微信支付      wx.requestPayment({        timeStamp: ret.data.data.timeStamp,        nonceStr: ret.data.data.nonceStr,        package: ret.data.data.package,        signType: ret.data.data.signType,        paySign: ret.data.data.paySign,        'success': function (res) {          that.afterPaySuccess(ret.data.data.orderid);        },        'fail': function (res) {          console.log(res);        }      })    }  } else {    util.showTip(ret.data.msg, '提交訂單失敗');  }});/** * 網絡請求 */function http(url, params, callback) {  wx.request({    url: url,    data: params,    success: function (res) {      callback(res);    },    fail: function (err) {      console.log(err);    }  });}

Step3: 接口代碼:

public function pay(){    $cart = I('cart', '', 'trim');    $cartAmount = I('cartamount');    $addressId = I('addressid', 0, 'intval');    $payment = I('payment', '', 'trim');    $userId = $this->userid;    $cart = json_decode($cart, true);    if (empty($cart)) {      $result['msg'] = '購物車獲取失敗';      $result['code'] = 0;      $this->ajaxReturn($result);    }    $totalMoney = 0;    foreach ($cart as $goods) {      $money = $goods['price'];  // price      $selectCount = $goods['selectcount'];  // price      $itemAmount = number_format($money * $selectCount, 2, '.', '');      $totalMoney += $itemAmount;    }    // 檢查總金額是否一致    if ($totalMoney != $cartAmount) {      $result['msg'] = '總金額不匹配:' . $totalMoney;      $result['code'] = 0;      $this->ajaxReturn($result);    }    // 獲取用戶地址    $address = M('MemberAddress')->where('userid=' . $userId . " and id=" . $addressId)->find();    if (empty($address)) {      $result['msg'] = '用戶地址不存在';      $result['code'] = 0;      $this->ajaxReturn($result);    }    // 用戶信息    $user = M('Member')->where("id=" . $userId)->find();    if ($payment == 'balance') {      if ($user['amount'] < $cartAmount) {        $result['msg'] = '余額不足';        $result['code'] = 0;        $this->ajaxReturn($result);      }    }    // 生成訂單    $order['ordersn'] = $this->genOrdersn($user['id']);    $order['price'] = $cartAmount;    $order['addressid'] = $address['id'];    $order['addressinfo'] = serialize($address); //json_encode($address);    $order['longitude'] = $address['longitude'];    $order['latitude'] = $address['latitude'];    $order['addtime'] = time();    $order['status'] = 0;    $order['userid'] = $user['id'];    $order['paytype'] = $payment;    $order['paysn'] = '';    $order['paytime'] = time();    $orderId = M("Order")->add($order);    if ($orderId == 0) {      $result['msg'] = '創建訂單失敗';      $result['code'] = 0;      $this->ajaxReturn($result);    }    foreach ($cart as $goods) {      $orderGoods['orderid'] = $orderId;      $orderGoods['goodsid'] = $goods['id'];      $orderGoods['title'] = $goods['title'];      $orderGoods['price'] = $goods['price'];      $orderGoods['attr'] = $goods['attr'];      $orderGoods['pic'] = $goods['pic'];      $orderGoods['num'] = $goods['selectcount'];      M("OrderGoods")->add($orderGoods);    }    if ($payment == 'balance') {      // 余額支付      $this->balancePay($cartAmount, $user['wxopenid'], $orderId);    } else if ($payment == 'weixin') {      // 微信支付      $this->weixinPay($cartAmount, $user['wxopenid'], $orderId, $order['ordersn']);    }}/*** 微信支付* @author 大臉貓臉大* @param $cart* @param $cartAmount* @param $address* @param $user*/private function weixinPay($cartAmount, $openId, $orderId, $orderSn){    import("Vendor.Wxpay.lib.WxPay#Api", "", ".php");    //訂單號    $money = $cartAmount * 100;    $openid = $openId;    $input = new /WxPayUnifiedOrder();    $input->SetBody("迪克-商品");    $input->SetOut_trade_no("$orderSn");    $input->SetTotal_fee("$money");    $input->SetNotify_url("https://" . $_SERVER['HTTP_HOST'] . "/api/buy/payNotify");    $input->SetTrade_type("JSAPI");    $input->SetOpenid($openid);    $unifiedOrder = /WxPayApi::unifiedOrder($input);    if ($unifiedOrder['result_code'] == 'SUCCESS' && $unifiedOrder['return_code'] == 'SUCCESS') {      $time = time();      $data['timeStamp'] = "$time";              //時間戳      $data['nonceStr'] = $unifiedOrder['nonce_str'];     //隨機字符串      $data['signType'] = 'MD5';                //簽名算法,暫支持 MD5      $data['package'] = 'prepay_id=' . $unifiedOrder['prepay_id'];  //統一下單接口返回的 prepay_id 參數值,提交格式如:prepay_id=*      $data['paySign'] = $this->genPaySign($unifiedOrder, $time);// 之前以為是$unifiedOrder['sign']; 后來發現是調用的這種方法. 簽名方案參見微信公眾號支付幫助文檔;      $data['out_trade_no'] = $orderSn;      $data['orderid'] = $orderId;      $return['code'] = 1;      $return['data'] = $data;    } else {        Log::write(var_export($unifiedOrder, true), Log::ERR, '', C('LOG_PATH')."wx_pay_".date('y_m_d').'.log');        $return['code'] = 0;        $return['msg'] = '微信支付失敗';// $unifiedOrder['RETURN_MSG'];    }    $this->ajaxReturn($return);}/* 生成支付簽名*/private function genPaySign($unifiedOrder, $time){    $appId = /WxPayConfig::APPID;    $nonceStr = $unifiedOrder['nonce_str'];    $package = 'prepay_id=' . $unifiedOrder['prepay_id'];    $signType = "MD5";    $timeStamp = $time;    $key = /WxPayConfig::KEY;    $sign = md5(sprintf("appId=%s&nonceStr=%s&package=%s&signType=%s&timeStamp=%s&key=%s", $appId, $nonceStr, $package, $signType, $timeStamp, $key));    return $sign;}/*** 支付回調* @author:大臉貓臉大*/public function payNotify(){    import("Vendor.Wxpay.lib.WxPay#Data", "", ".php");    $xml = $GLOBALS['HTTP_RAW_POST_DATA'];    $val = /WxPayResults::Init($xml);    if ($val['result_code'] == 'SUCCESS' && $val['return_code'] == 'SUCCESS') {      $orderSn = $val['out_trade_no'];      $transactionId = $val['transaction_id'];      $data = array('paytype' => 'weixin', 'status' => '1', 'paytime' => time(), 'paysn' => $transactionId);      M("Order")->where("ordersn='$orderSn'")->setField($data);      exit('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');    }else {      Log::write(var_export($val, true), Log::ERR, '', C('LOG_PATH')."wx_pay_notify_".date('y_m_d').'.log');      exit('<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');    }}

payNotify 回調方法里一定要注意返回

<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>

如果不處理,你會發現payNotify  會被執行很多次參見:官方文檔

總結一下: 注意二點, 1.簽名的問題 2. 回調方法的返回處理。

歡迎大家指正。

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三区黄色| 欧美午夜精品在线| 欧美老女人性生活| 亚洲欧美一区二区三区四区| 国产成人亚洲综合| 欧美日韩国产丝袜另类| 国产69精品99久久久久久宅男| 久久久女女女女999久久| 亚洲精品999| 欧美激情一区二区久久久| 日韩欧美国产一区二区| 亚洲欧美日韩成人| 国产视频久久久| 国产亚洲欧美日韩精品| 日韩欧美在线视频| 91影院在线免费观看视频| 欧美日韩福利电影| 成人国内精品久久久久一区| 国产成人精品久久亚洲高清不卡| 欧美俄罗斯性视频| 国产精品日日摸夜夜添夜夜av| 亚洲经典中文字幕| 精品久久久久久久久久久| 97视频免费看| 高清欧美性猛交| 狠狠久久亚洲欧美专区| 国产精品久久久久久av福利| 国产精品电影久久久久电影网| 日韩欧美在线一区| xvideos亚洲| 亚洲欧美国产精品久久久久久久| 国产亚洲精品久久久久久| 欧美诱惑福利视频| 久久中文字幕一区| 午夜精品一区二区三区视频免费看| 日韩av片免费在线观看| 97在线观看免费| 97在线视频国产| 日韩视频欧美视频| 成人性生交大片免费看视频直播| 亚洲va欧美va在线观看| 久久99热精品这里久久精品| 欧美日韩国产在线| 色综久久综合桃花网| 亚洲永久在线观看| 亚洲第一福利视频| 国产日韩中文字幕| 亚洲第一免费网站| 欧美精品亚州精品| 日韩在线免费高清视频| 成人在线观看视频网站| 国产精品欧美激情在线播放| 亚洲成年网站在线观看| 怡红院精品视频| 尤物yw午夜国产精品视频明星| 精品国内亚洲在观看18黄| 国产精品白丝jk喷水视频一区| 日韩高清a**址| 亚洲二区中文字幕| 欧美日韩国产专区| 亚洲欧美日韩中文视频| 免费91在线视频| 亚洲a∨日韩av高清在线观看| 亚洲无限av看| 国产精品视频xxx| 久久久久久网站| 久久色精品视频| 6080yy精品一区二区三区| 中文欧美日本在线资源| 欧美成年人视频| 欧美高清视频在线观看| 久久最新资源网| 97人人做人人爱| 精品无人国产偷自产在线| 久久99久久久久久久噜噜| 亚洲伊人成综合成人网| 亚洲国产日韩精品在线| 久久久精品视频成人| 日韩精品久久久久久福利| 另类视频在线观看| 国产极品jizzhd欧美| 国产亚洲综合久久| 韩剧1988在线观看免费完整版| 亚洲欧美中文字幕在线一区| 色哟哟网站入口亚洲精品| 亚洲成人免费在线视频| 成人免费淫片视频软件| 青青精品视频播放| 亚洲综合大片69999| 久久久精品网站| 亚洲一区二区三区xxx视频| 久久久久久久久久国产| 精品呦交小u女在线| 国产精品免费福利| 欧美日韩亚洲国产一区| 色噜噜狠狠色综合网图区| 久久99青青精品免费观看| 欧美激情亚洲国产| 久久久国产一区二区| 亚洲国产精品免费| 亚洲精品日韩激情在线电影| 亚洲人成电影网站| 久久久亚洲福利精品午夜| 亚洲精品动漫100p| 91最新在线免费观看| 国产精品久久久久高潮| 在线成人激情黄色| 亚洲精品日韩在线| 亚洲人成网在线播放| 亚洲综合在线播放| 亚洲欧美国产精品专区久久| 中文字幕自拍vr一区二区三区| 一色桃子一区二区| 国产精品电影网站| 亚洲电影中文字幕| 91人人爽人人爽人人精88v| 国产美女精品免费电影| 亚洲欧美三级伦理| 2021国产精品视频| 精品国产美女在线| 国产成人精品一区二区| 日韩欧美综合在线视频| 亚洲www永久成人夜色| 日韩美女视频免费看| 亚洲精品美女免费| 亚洲国产天堂久久国产91| 一区二区欧美日韩视频| 国产精品人成电影| 国产在线久久久| 欧美丰满少妇xxxxx| 91久久精品久久国产性色也91| 日韩经典中文字幕| 亚洲精品视频二区| 欧美精品在线观看| 91av在线网站| 欧美在线亚洲一区| 国产成人亚洲综合91| 97久久伊人激情网| 日本欧美一二三区| 久久精品视频va| 国产精品高清网站| 午夜精品理论片| 亚洲国产精品va在线看黑人动漫| 精品国产欧美一区二区五十路| 国产欧美日韩亚洲精品| 日韩电影中文字幕av| 91九色单男在线观看| 国内精品久久影院| 黑人狂躁日本妞一区二区三区| 亚洲最大福利网站| 亚洲天堂2020| 国产精品美女在线| 久久精视频免费在线久久完整在线看| 九九九久久国产免费| 中文字幕日韩精品在线| 精品国产欧美成人夜夜嗨| 日韩中文字幕国产| yellow中文字幕久久| 久久91精品国产91久久久| 欧美又大又硬又粗bbbbb| 久久免费视频这里只有精品| 欧美激情图片区| 57pao成人永久免费视频| 97国产精品视频人人做人人爱|