當前位置:首頁 » 編程語言 » php開發微信支付

php開發微信支付

發布時間: 2024-04-25 06:57:38

php微信支付開發中prepayid是什麼意思

是訂單id
H5調用微信支付API時,需要相應參數,其中就包含package。package一般格式為「prepay_id=***」,prepay_id就是指下單時生成的訂單id,通過調用「統一下單」介面(https://api.mch.weixin.qq.com/pay/unifiedorder)來獲取

② php開發微信支付要多久

1到5天。使用php開發微信支付時,由於審核速度較慢,需要花費1到5天的時間。微信支付是騰訊集團旗下的第三方支付平台,致力於為用戶和企業提供安全、便捷、專業的在線支付服務。

③ thinkphp微信支付配置怎麼修改

Thinkphp整合微信支付功能的相關資料
我要告訴你我這一篇文章寫的是微信支付之中的(普通商戶而非服務商商戶的統一下單JSPI)微信支付:
其實自己整合SDK失敗了,用了一個博客博主整合的代碼,在這里寫一下筆記:
前面准備:
1、微信公眾號:
獨特的appid、appscrect、介面許可權之中設置可以獲取用戶ID信息許可權的域名(每個用戶對於不同公眾都會有一個特有ID,通過這個ID獲取用戶微信賬號基本信息、詳情看微信開發者文檔)、在微信支付按鈕出設置微信支付授權目錄(寫到發起請求的控制器那一層)、設置開發者微信賬號為測試白名單(用微信開發者工具的時候需要)2、微信支付平台:
商戶平台登陸賬號、支付密鑰(隨時可以自行設置,只能有一個)、3、整合進去thinkphp之中邏輯:
前端微信支付按鈕設置點擊調用支付發起控制器方法、控制器運行,引用微信支付類、獲取用戶openid、獲取訂單數據、拼接出所有普通商戶預支付jsp需要的數據,display出那個自定義的支付頁面、在支付頁面點擊支付、調用微信提供的jspi發起支付的scripet函數發起支付、支付完成以後頁面會重定向到(在自定義支付頁面的script函數里設置的跳轉目錄{:U('controller/function)}),並且非同步(靜默)設置的非同步處理訂單邏輯(記錄支付時間啦、標記為已經支付啦、標記是微信支付啦)之類的、代碼:
我的訂單頁面的微信支付按鈕:
<a href="{:U('Wxpay/js_api_start',array('order_key_num'=>$v['order_key_num]))}"> 微信支付</a>
發起支付控制器Wxpay:
<?php
namespace Home\Controller;
use Think\Controller;
//微信支付類
class WxpayController extends Controller {//獲取access_token過程中的跳轉uri,通過跳轉將code傳入jsapi支付頁面public function js_api_start(){if(!empty($_GET['order_key_num'])){
// session(array('pay_now_id'=>$_GET['order_key_num'],'expire'=>3600));S('pay_now_id',$_GET['order_key_num'],3600);}
vendor('Weixinpay.WxPayPubHelper');
//使用jsapi介面
$jsApi = new \JsApi_pub();
//=========步驟1:網頁授權獲取用戶openid============//通過code獲得openidif($_GET['code'] == ''){
//跳轉
$redirect_uri = 'https://當前域名+模塊+控制器+方法';$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=公眾號特有IDredirect_uri='.$redirect_uri.'&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect';header("Location: $url");exit();
}else{
//獲取openid
$url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=公眾號ID&secret=公眾號scrept&code='.$_GET['code'].'&grant_type=authorization_code';$openid_arr = json_decode(file_get_contents($url),true);}
$openid=$openid_arr['openid'];
$pay_now_id = S('pay_now_id');
if($pay_now_id){
$id=$pay_now_id;
$o = D('order_info');
$order_info = $o->where('order_id = %d',$id)->find();if(empty($order_info['paycode'])){$order_info['paycode'] = 'weixin';
}
if($order_info['is_pay']){
$this->error('當前訂單已經支付');
}
}else{
$this->error("不存在當前訂單編號!");
}
$res = array(
'order_sn' => $order_info['order_sn'],
'order_amount' => $order_info['pay_money']
);
//=========步驟2:使用統一支付介面,獲取prepay_id============//使用統一支付介面$unifiedOrder = new \UnifiedOrder_pub();
//設置統一支付介面參數
//設置必填參數
//appid已填,商戶無需重復填寫
//mch_id已填,商戶無需重復填寫
//noncestr已填,商戶無需重復填寫
//spbill_create_ip已填,商戶無需重復填寫
//sign已填,商戶無需重復填寫
$total_fee = $order_info['pay_money']*100;// $total_fee = $res['order_amount'];//$total_fee = 1;
// var_mp($order_info['pay_money']);die;$body = "訂單支付";$unifiedOrder->setParameter("openid", "$openid");//用戶標識$unifiedOrder->setParameter("body", '商品采購');//商品描述//自定義訂單號,此處僅作舉例$unifiedOrder->setParameter("out_trade_no", $order_info['order_sn']);//商戶訂單號$unifiedOrder->setParameter("total_fee", $total_fee);//總金額//$unifiedOrder->setParameter("attach", "order_sn={$res['order_sn']}");//附加數據$unifiedOrder->setParameter("notify_url", \WxPayConf_pub::NOTIFY_URL);//通知地址$unifiedOrder->setParameter("trade_type", "JSAPI");//交易類型//非必填參數,商戶可根據實際情況選填//$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商戶號//$unifiedOrder->setParameter("device_info","XXXX");//設備號//$unifiedOrder->setParameter("attach","XXXX");//附加數據//$unifiedOrder->setParameter("time_start","XXXX");//交易起始時間//$unifiedOrder->setParameter("time_expire","XXXX");//交易結束時間//$unifiedOrder->setParameter("goods_tag","XXXX");//商品標記//$unifiedOrder->setParameter("openid","XXXX");//用戶標識//$unifiedOrder->setParameter("proct_id","XXXX");//商品ID$prepay_id = $unifiedOrder->getPrepayId();// var_mp($prepay_id);die;//=========步驟3:使用jsapi調起支付============$jsApi->setPrepayId($prepay_id);$jsApiParameters = $jsApi->getParameters();$wxconf = json_decode($jsApiParameters, true);if ($wxconf['package'] == 'prepay_id=') {$this->error('當前訂單存在異常!');}
$this->assign('res', $res);
$this->assign('jsApiParameters', $jsApiParameters);$this->display('jsapi');}
//非同步通知url,商戶根據實際開發過程設定
public function notify_url() {
vendor('Weixinpay.WxPayPubHelper');
//使用通用通知介面
$notify = new \Notify_pub();
//存儲微信的回調
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$notify->saveData($xml);
//驗證簽名,並回應微信。
//對後台通知交互時,如果微信收到商戶的應答不是成功或超時,微信認為通知失敗,//微信會通過一定的策略(如30分鍾共8次)定期重新發起通知,//盡可能提高通知的成功率,但微信不保證通知最終能成功。
if($notify->checkSign() == FALSE){
$notify->setReturnParameter("return_code", "FAIL");//返回狀態碼$notify->setReturnParameter("return_msg", "簽名失敗");//返回信息}else{$notify->setReturnParameter("return_code", "SUCCESS");//設置返回碼}
$returnXml = $notify->returnXml();
//==商戶根據實際情況設置相應的處理流程,此處僅作舉例=======//以log文件形式記錄回調信息//$log_name = "notify_url.log";//log文件路徑//$this->log_result($log_name, "【接收到的notify通知】:\n".$xml."\n");$parameter = $notify->xmlToArray($xml);//$this->log_result($log_name, "【接收到的notify通知】:\n".$parameter."\n");if($notify->checkSign() == TRUE){if ($notify->data["return_code"] == "FAIL") {//此處應該更新一下訂單狀態,商戶自行增刪操作//$this->log_result($log_name, "【通信出錯】:\n".$xml."\n");//更新訂單數據【通信出錯】設為無效訂單echo 'error';
}
else if($notify->data["result_code"] == "FAIL"){//此處應該更新一下訂單狀態,商戶自行增刪操作//$this->log_result($log_name, "【業務出錯】:\n".$xml."\n");//更新訂單數據【通信出錯】設為無效訂單echo 'error';
}
else{
//$this->log_result($log_name, "【支付成功】:\n".$xml."\n");//我這里用到一個process方法,成功返回數據後處理,返回地數據具體可以參考微信的文檔if ($this->process($parameter)) {//處理成功後輸出success,微信就不會再下發請求了echo 'success';}else {
//沒有處理成功,微信會間隔的發送請求
echo 'error';
}
}
}
}
//訂單處理
private function process($parameter) {
//此處應該更新一下訂單狀態,商戶自行增刪操作/** 返回的數據最少有以下幾個
* $parameter = array(
'out_trade_no' => xxx,//商戶訂單號
'total_fee' => XXXX,//支付金額
'openid' => XXxxx,//付款的用戶ID
);
*/
$data = array(
'order_sn'=>$parameter['out_trade_no'],
'des'=>('訂單交易:'.$parameter['out_trade_no']),'money'=>$parameter['total_fee'],);
orderhandlestarysdgdss($data);//這是一個common方法,他會將該訂單狀態設置為已支付之類的return true;}
}
?>
發起支付後拼接預支付數據參數(參數列表看微信普通商戶開發者文檔——微信支付——統一下單)display的頁面:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />
<meta name="format-detection" content="telephone=no"/>
<title>下</title>
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
<meta name="keyword" content="">
<meta name="description" content="">
<script type="text/javascript">
var order_sn = "{$res['order_sn']}";
//調用微信JS api 支付
function jsApiCall(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
<?php echo $jsApiParameters; ?>,
function(res){
//如果支付成功
if (res.err_msg == 'get_brand_wcpay_request:ok') {//支付成功後跳轉的地址location.href = "{:U('Home/User/my_order')}";}else if (res.err_msg == 'get_brand_wcpay_request:cancel') {alert('請盡快完成支付哦!');}else if (res.err_msg == 'get_brand_wcpay_request:fail') {alert('支付失敗');}else {
alert('意外錯誤');
}
//WeixinJSBridge.log(res.err_msg);
//alert(res.err_code+res.err_desc+res.err_msg);/*if (res.err_msg == 'get_brand_wcpay_request:ok') {alert('支付成功');}else {
alert('取消支付');
}*/
}
);
}
function callpay(){
if (typeof WeixinJSBridge == "undefined"){if( document.addEventListener ){document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);}else if (document.attachEvent){document.attachEvent('WeixinJSBridgeReady', jsApiCall);document.attachEvent('onWeixinJSBridgeReady', jsApiCall);}
}else{
jsApiCall();
}
}
</script>
<style>
*{font-family:'微軟雅黑','Microsoft YaHei';}
body #head{position:relative;z-index:99999999999999;padding:0 10px;}
body .zh-head{padding:0 0 0 0;height:auto;}
.zh-head-conter{position:relative;height:40px;}
.zh-logo{position:absolute;left:50%;top:0;margin:0 0 0 -60px;float:none;width:auto;}
.zh-logo a{display:block;}
.zh-logo img{width:120px;height:40px;display:block;}
.heads_fix .zh-logo{}
#head{position:fixed!important;left:0;top:0;right:0;z-index:99999;background:#fff;border-bottom:1px solid #ddd;}
.zh-logo{height:40px;}
.flowpay{margin-top:25%;}
.flowpay dt{text-align:center;}
.flowpay strong.price{font-size:40px;}
.wxLogo{text-align:center;}
.wxLogo img{}
.flowpay dd{margin:0;padding:20px 0 10px 0;}
.flowpay dd input{margin:0 auto;padding:0;width:90%;height:45px;line-height:45px;border:0;border-radius:4px;background:#0CBC0A;color:#fff;font-size:17px;display:block;-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;}
</style>
</head>
<body>
<!--頭部開始-->
<div class="flowpay">
<dl>
<dt>
<p class="wxLogo"><img src="__PUBLIC__/home/images/1479953699138120.png" alt=""></p>
本次訂單需支付:¥<strong class="price">{$res['order_amount']}</strong> 元</dt>
<dd>
<input type="button" id="hhhhhh" onclick="callpay()" value="立即支付" />
</dd>
</dl>
</div>
<!--尾結束-->
</body>
</html>
然後就是類文件啦:

④ Thinkphp5.1寰淇″皬紼嬪簭鏀浠

鐮旂┒浜嗗ソ鍑犲ぉ錛屽潙涔熼亣鍒頒簡錛屼篃鐧懼害浜嗗緢涔呯幇鍦ㄧ粓浜庡仛瀹屼簡錛岀粰澶у跺垎浜鍑烘潵錛

鎴戣繖涓涔熸槸鍙傝冨埆浜哄啓鐨勩傛湁涓嶆槑鐧界殑鏈嬪弸鍙浠ラ棶鎴

public function unifiedorder($order_no, $openid, $total_fee, $attach, $order_id, $user_id){

    // 褰撳墠鏃墮棿

    $time = time();

    // 鐢熸垚闅忔満瀛楃︿覆

    $nonceStr = md5($time . $openid);

    // API鍙傛暟

    $params = [

        'appid' => $this->appid,                                  //寰淇″垎閰嶇殑灝忕▼搴廼d

        'attach' => $attach,                                      //闄勫姞鏁版嵁錛屽湪鏌ヨAPI鍜屾敮浠橀氱煡涓鍘熸牱榪斿洖錛屽彲浣滀負鑷瀹氫箟鍙傛暟浣跨敤銆

        'body' => '浼氬憳鍗',                                      //鍕熸崘鎻忚堪

        'mch_id' => $this->mchid,                        //寰淇℃敮浠樺垎閰嶇殑鍟嗘埛鍙

        'nonce_str' => $nonceStr,                                  //闅忔満瀛楃︿覆錛32浣嶄互鍐

        'notify_url' => $this->notify_url,                    //            base_url() . 'notice.php?s=/task/notify/order/wxapp_id/'.$wxapp_id, // 寮傛ラ氱煡鍦板潃

        'openid' => $openid,                                      //鐢ㄦ埛鏍囪瘑錛泃rade_type=JSAPI錛屾ゅ弬鏁板繀浼狅紝鐢ㄦ埛鍦ㄥ晢鎴穉ppid涓嬬殑鍞涓鏍囪瘑銆

        'out_trade_no' => $order_no,                              //鍟嗘埛璐﹀崟鍙

        'spbill_create_ip' => \request()->ip(),                    //緇堢疘P錛涙敮鎸両PV4鍜孖PV6涓ょ嶆牸寮忕殑IP鍦板潃銆傝皟鐢ㄥ井淇℃敮浠楢PI鐨勬満鍣↖P

        'total_fee' => (int)$total_fee * 100, // 浠鋒牸:鍗曚綅鍒              // 浠鋒牸:鍗曚綅鍒

        'trade_type' => 'JSAPI',                                  //浜ゆ槗綾誨瀷

    ];

    // 鐢熸垚絳懼悕

    $params['sign'] = $this->makeSign($params);  //榪欎釜鍦版柟鏈鍧戱紝闇瑕佺殑鏄閰嶇疆 1銆乤ppid鍜屽晢鎴峰彿蹇呴』鏄緇戝畾鐨勭姸鎬

    // 璇鋒眰API

    $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';

    $result = $this->post($url, $this->toXml($params));

    $prepay = $this->fromXml($result);

    //娣誨姞preapay_id

    $data = [

        'user_id' => $user_id,

        'order_id' => $order_id,

        'attach' => json_encode($attach),

        'prepay_id' => $prepay['prepay_id'],

    ];

    (new AppleWxPrepay())->addInfo($data);

    // 璇鋒眰澶辮觸

    if ($prepay['return_code'] === 'FAIL') {

        return [API_CODE_NAME => 2000004, API_MSG_NAME => $prepay['return_msg']];

    }

    if ($prepay['result_code'] === 'FAIL') {

        return [API_CODE_NAME => 2000004, API_MSG_NAME => $prepay['err_code_des']];

    }

    // 鐢熸垚 nonce_str 渚涘墠絝浣跨敤

    $paySign = $this->makePaySign($params['nonce_str'], $prepay['prepay_id'], $time);

    return [

        'prepay_id' => $prepay['prepay_id'],

        'nonceStr' => $nonceStr,

        'timeStamp' => (string)$time,

        'paySign' => $paySign

    ];

}

/**

* 鐢熸垚絳懼悕

* @param $values

* @return string 鏈鍑芥暟涓嶈嗙洊sign鎴愬憳鍙橀噺錛屽傝佽劇疆絳懼悕闇瑕佽皟鐢⊿etSign鏂規硶璧嬪

*/

private function makeSign($values)

{

    //絳懼悕姝ラや竴錛氭寜瀛楀吀搴忔帓搴忓弬鏁

    ksort($values);

    $string = $this->toUrlParams($values);

    //絳懼悕姝ラや簩錛氬湪string鍚庡姞鍏KEY

    $string = $string . '&key=' . $this->apikey;

    //絳懼悕姝ラや笁錛歁D5鍔犲瘑

    $string = md5($string);

    //絳懼悕姝ラゅ洓錛氭墍鏈夊瓧絎﹁漿涓哄ぇ鍐

    $result = strtoupper($string);

    return $result;

}

/**

* 鏍煎紡鍖栧弬鏁版牸寮忓寲鎴恥rl鍙傛暟

* @param $values

* @return string

*/

private function toUrlParams($values)

{

    $buff = '';

    foreach ($values as $k => $v) {

        if ($k != 'sign' && $v != '' && !is_array($v)) {

            $buff .= $k . '=' . $v . '&';

        }

}

    return trim($buff, '&');

}

/**

* 妯℃嫙POST璇鋒眰

* @param $url

* @param array $data

* @param bool $useCert

* @param array $sslCert

* @return mixed

*/

public function post($url, $data = [], $useCert = false, $sslCert = [])

{

    $header = [

        'Content-type: application/json; charset=UTF8'

    ];

    $curl = curl_init();

    curl_setopt($curl, CURLOPT_URL, $url);

    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

    curl_setopt($curl, CURLOPT_HEADER, false);

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($curl, CURLOPT_POST, TRUE);

    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

    if ($useCert == true) {

        // 璁劇疆璇佷功錛歝ert 涓 key 鍒嗗埆灞炰簬涓や釜.pem鏂囦歡

        curl_setopt($curl, CURLOPT_SSLCERTTYPE, 'PEM');

        curl_setopt($curl, CURLOPT_SSLCERT, $sslCert['certPem']);

        curl_setopt($curl, CURLOPT_SSLKEYTYPE, 'PEM');

        curl_setopt($curl, CURLOPT_SSLKEY, $sslCert['keyPem']);

    }

    $result = curl_exec($curl);

    curl_close($curl);

    return $result;

}

/**

* 杈撳嚭xml瀛楃

* @param $values

* @return bool|string

*/

private function toXml($values)

{

    if (!is_array($values) || count($values) <= 0) {

        return false;

    }

    $xml = "<xml>";

    foreach ($values as $key => $val) {

        if (is_numeric($val)) {

            $xml .= "<" . $key . ">" . $val . "</" . $key . ">";

        } else {

            $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";

        }

}

    $xml .= "</xml>";

    return $xml;

}

/**

* 灝唜ml杞涓篴rray

* @param $xml

* @return mixed

*/

private function fromXml($xml)

{

    // 紱佹㈠紩鐢ㄥ栭儴xml瀹炰綋

    libxml_disable_entity_loader(true);

    return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);

}

/**

* 鐢熸垚paySign

* @param $nonceStr

* @param $prepay_id

* @param $timeStamp

* @return string

*/

private function makePaySign($nonceStr, $prepay_id, $timeStamp)

{

    $data = [

        'appId' => $this->appid,

        'nonceStr' => $nonceStr,

        'package' => 'prepay_id=' . $prepay_id,

        'signType' => 'MD5',

        'timeStamp' => $timeStamp,

    ];

    // 絳懼悕姝ラや竴錛氭寜瀛楀吀搴忔帓搴忓弬鏁

    ksort($data);

    $string = $this->toUrlParams($data);

    // 絳懼悕姝ラや簩錛氬湪string鍚庡姞鍏KEY

    $string = $string . '&key=' . $this->apikey;

    // 絳懼悕姝ラや笁錛歁D5鍔犲瘑

    $string = md5($string);

    // 絳懼悕姝ラゅ洓錛氭墍鏈夊瓧絎﹁漿涓哄ぇ鍐

    $result = strtoupper($string);

    return $result;

}

/*********************************寰淇″洖璋**********************/

public function getNotify()

{

    if (!$xml = file_get_contents('php://input')) {

        $this->returnCode(50000001, 'Not found DATA');

    }

    // 灝嗘湇鍔″櫒榪斿洖鐨刋ML鏁版嵁杞鍖栦負鏁扮粍

    $data = $this->fromXml($xml);

    $payLog = new ApplePayLog();

    // 璁板綍鏃ュ織

    $payLog->addInfo(['content'=>json_encode($xml)]);

    $payLog->addInfo(['content'=>json_encode($data)]);

    // 瀹炰緥鍖栬處鍗曟ā鍨

    $OrderModel = new AppleOrder();

    // 璐﹀崟淇℃伅

    $orderInfo = $OrderModel->getInfo(['id'=>$data['attach']],'*');

    if (empty($orderInfo)) {

        $this->returnCode(50000001, '璐﹀崟涓嶅瓨鍦');

    }

    if($orderInfo['pay_status'] != 1 || !empty($orderInfo['pay_time'])){

        $this->returnCode(50000001,'璁㈠崟宸叉敮浠橈紝璇峰嬁鍐嶆℃敮浠');

    }

    // 淇濆瓨寰淇℃湇鍔″櫒榪斿洖鐨勭懼悕sign

    $dataSign = $data['sign'];

    $return_code = $data['return_code'];

    $result_code = $data['result_code'];

    $data['body'] = '浼氬憳鍗';

    $data['spbill_create_ip'] = \request()->ip();

    $data['notify_url'] = $this->notify_url;

    // sign 涓 s 鍙傛暟 涓嶅弬涓庣懼悕綆楁硶

    unset($data['sign']);

    unset($data['transaction_id']);

    unset($data['coupon_id']);

    unset($data['coupon_type']);

    unset($data['coupon_count']);

    unset($data['coupon_fee']);

    unset($data['time_end']);

    unset($data['return_code']);

    unset($data['result_code']);

    unset($data['is_subscribe']);

    unset($data['fee_type']);

    unset($data['bank_type']);

    unset($data['bank_type']);

    // 鐢熸垚絳懼悕

    $sign = $this->makeSign($data);

    // 鍒ゆ柇絳懼悕鏄鍚︽g『  鍒ゆ柇鏀浠樼姸鎬

    if (($sign === $dataSign) && ($return_code == 'SUCCESS') && ($result_code == 'SUCCESS')) {

        $OrderModel->startTrans();

        try {

            // 璐﹀崟鏀浠樻垚鍔熶笟鍔″勭悊

            $appleOrderInfo = $OrderModel->where(['id'=>$orderInfo['id']])->lock(true)->find();

            $result = $appleOrderInfo->addInfo(['pay_status'=>2,'pay_time'=>time()],['id'=>$orderInfo['id']]);

            if(!$result){

                $OrderModel->rollback();

                $this->returnCode(5000003, '淇鏀硅㈠崟澶辮觸錛屽け璐ュ師鍥狅細'.$OrderModel->getError());

            }

            $appleUserModel = new AppleUser();

            $appleUserInfo =  $appleUserModel->where(['openid'=>$orderInfo['openid']])->lock(true)->find();

            $appleUser = $appleUserInfo->where(['openid'=>$orderInfo['openid']])->setInc('moxibustion',$orderInfo['moxibustion']);

            if(!$appleUser){

                $OrderModel->rollback();

                $this->returnCode(5000003, '娣誨姞浼氬憳閽堢伕嬈℃暟澶辮觸錛屽け璐ュ師鍥狅細'.$appleUserModel->getError());

            }

        }catch (\Exception $exception){

            $OrderModel->rollback();

            $this->returnCode(5000003, '鎿嶄綔澶辮觸錛屽け璐ュ師鍥狅細'.$exception->getMessage());

        }

            $OrderModel->commit();

        // 榪斿洖鐘舵

        die(json(['code'=>0,'鏀浠樻垚鍔']));

    }

    // 榪斿洖鐘舵

    $this->returnCode(2000003, '絳懼悕澶辮觸');

}

⑤ PHP對接第三方支付渠道之微信支付v3版本

文接上篇 PHP如何更科學地接入第三方渠道 ,既然已經寫到這了,索性創建了一個gitee倉庫,地址: https://gitee.com/wuzhh/tp6-payment ,有需要的可以去看看。

言歸正傳,微信支付v3版本剛推出不久,鑒於微信官方一貫語焉不詳的尿性,論壇上自然仍舊一片哀嚎,鄙人一路踩坑下來,倒也還算順利,把過程分享給大家參考~

在微信商戶平台中找到API安全,這一步按照官方提示操作即可,比較簡單不再贅述

注意,第1步中導出的證書有三個文件,以我的經驗只有apiclient_key.pem是有用的,apiclient_cert.pem則沒什麼用(沒發現它有什麼用),拿到apiclient_key.pem的路徑之後:

上面是官方提供的命令,此處:
apiV3key = 設置的v3秘鑰
mchId = 商戶號
mchPrivateKeyFilePath = apiclient_key.pem的路徑
mchSerialNo = 商戶API證書序列號
outputFilePath = 微信支付平台證書的存儲路徑

你可能會問,-c參數填啥?這里需要說一下這個參數是驗證證書用的,填的是微信支付平台證書的路徑,因為我們現在是 第一次創建證書,所以-c參數不需要填寫 ,需要特別注意一下。

這樣就能確保上文注入的支付實例都有共同的支付和回調方法

有部分方法文中沒上,我個人的項目中用上了,就暫且保留吧

通知部分過段時間再更,明天就算端午節就更到這了,有需要的小夥伴可以留言,我爭取盡快補上~

熱點內容
騰訊視頻上傳技巧 發布:2024-11-28 02:28:05 瀏覽:238
2016資料庫系統工程師 發布:2024-11-28 02:22:16 瀏覽:891
壓縮機飛動 發布:2024-11-28 02:00:04 瀏覽:273
50年腳本 發布:2024-11-28 01:58:38 瀏覽:220
光遇渠道服初音腳本怎麼換號 發布:2024-11-28 01:57:44 瀏覽:416
平板電腦配置怎麼看配置高不高 發布:2024-11-28 01:57:43 瀏覽:613
大逃殺掛機腳本 發布:2024-11-28 01:45:45 瀏覽:567
pythontimesleep 發布:2024-11-28 01:43:38 瀏覽:280
php圖片編輯 發布:2024-11-28 01:33:15 瀏覽:245
譚浩強c語言課後答案 發布:2024-11-28 01:32:38 瀏覽:10