1,申請流程
APP支付和微信公眾號支付區(qū)別如下:
不同參數(shù):
appid
:APP支付(開放平臺ID)建蹄、JSAPI支付(公眾號ID);
appsecret
:APP支付(開放平臺秘鑰)、JSAPI支付(公眾號秘鑰)啸澡;
trade_type
:APP支付(APP)拐邪、JSAPI支付(JSAPI)慰毅;
openid
:JSAPI支付必傳此參數(shù);
首先必須通知客戶先申請商戶號以及微信開放平臺扎阶,然后認證汹胃。
微信開放平臺
:https://open.weixin.qq.com/
微信商戶號
:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F
2,微信配置
說明:
APPID
微信開放平臺的APPID
MCHID
商戶號
KEY
商戶支付密鑰
APPSECRET
微信開放平臺的秘鑰
3东臀,商戶支付密鑰生成
密鑰由自己生成着饥,推薦使用在線密碼生成器。(32位字符串)
4惰赋,SDK開發(fā)者后臺接入
在開始后臺代碼前宰掉,我們必須有4個參數(shù),APPID
赁濒、商戶號
轨奄、商戶支付密鑰
、微信開放平臺的秘鑰
拒炎。 沒有這4個參數(shù)戚绕,就沒法喚起微信支付接口!!!
準備好后可以下載微信的官方demo代碼參考。https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1
[圖片上傳失敗...(image-99294-1595316836475)]
5枝冀,核心步驟代碼(微信APP支付)
說明:前端調(diào)用的方法
/*********************************微信支付*********************************/
// 接收前端的參數(shù)舞丛,這里省略
$data = [];
$data['user_id'] = $_REQUEST['userId'];
$data['level'] = $_REQUEST['level'];
// $data['order_money'] =abs($_REQUEST['orderMoney'])+0;
$data['order_money'] = 0.01; // 測試0.01元
$data['pay_type'] = $_REQUEST['payType'] == 1 ?'wxpay':'2';
if($data['pay_type'] == 2){
echo "<script>alert('請用微信支付')</script>";
die;
}
$data['goods_type'] = $_REQUEST['goodsType'];
// $data['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];
// 添加入庫訂單
$sql = "select name,parent_id from users where client_id=".$data['user_id'];
$result = $model->get_one($sql);
if($result['parent_id']){
$data['parent_id'] = $result['parent_id'];
}else{
$data['parent_id'] = 0;
}
// 生成平臺訂單號
$data['order_num'] = creation_order();
$data['product_name'] = '充值';
$data['create_time']=date('Y-m-d H:i:s');
$check = $model->insert('game_order',$data);
if($check){
$notify_url = "http://47.94.40.238/hjwyx/order_pay/pay2/notify.php"; // 異步通知地址
$res = start_pay($data,$notify_url); // 同步請求地址
//return $res;
echo json_encode($res);die;
}else{
exit('下單失敗,請檢查原因');
}
/**********************************************************/
}else{
exit("未接收到參數(shù)");
}
說明:start_pay方法
function start_pay($param,$notify_url)
{
$order =[];
//微信支付的金額基本單位是分,所以需要乘于100.客戶傳輸過來的金額單位是元
$price=bcmul($param['order_money'], 100);
// $price = (int)(($param['order_money']+0.00001)*100);
if($price <= 0 ){
echo "<script>alert('訂單金額錯誤')</script>";
die;
}
$input = new WxPayUnifiedOrder();
$input->SetAppid(WxPayConfig::APPID);
//充值內(nèi)容
$input->SetBody($param['product_name']);
//訂單號
$input->SetOut_trade_no($param['order_num']);
//訂單總金額
$input->SetTotal_fee($price);
// 設(shè)置訂單生成時間
$input->SetTime_start(date("YmdHis"));
// 設(shè)置訂單失效時間
$input->SetTime_expire(date("YmdHis", time() + 3600));
// 設(shè)置接收微信支付異步通知回調(diào)地址
$input->SetNotify_url($notify_url);
$input->SetTrade_type("APP");
//生成prepay_id字符串
try {
$order = WxPayApi::unifiedOrder($input);
if(!array_key_exists("appid", $order) || !array_key_exists("prepay_id", $order) || $order['prepay_id'] == ""){
return array('err_code'=>500,'err_msg'=>''.$order['return_msg']);
}
} catch (Exception $e) {
return array('err_code'=>500,'err_msg'=>$e->getMessage());
}
//
$time = time();
$t = array('appid'=>WxPayConfig::APPID,'partnerid'=>WxPayConfig::MCHID,'prepayid'=>$order['prepay_id'],'package'=>'Sign=WXPay','noncestr'=>$param['order_num'],'timestamp'=>$time);
ksort($t);
$str = '';
foreach ($t as $k => $v)
{
if($v != ""){
$str .= $k . "=" . $v . "&";
}
}
$str = trim($str, "&");
$str = $str . '&key=' .WxPayConfig::KEY;
$sign = strtoupper(md5($str));
$t['err_code'] = 0;
$t['err_msg'] = 'success';
$t['sign'] = $sign;
return $t;
}
說明:異步回調(diào)方法
public function notify()
{
$testxml = file_get_contents("php://input");
$jsonxml = json_encode(simplexml_load_string($testxml, 'SimpleXMLElement', LIBXML_NOCDATA));
$result = json_decode($jsonxml, true);//轉(zhuǎn)成數(shù)組,
file_put_contents("notify_data.txt", json_encode($result));
if($result){
// 判斷返回碼果漾,返回狀態(tài)碼是否存在
if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
// 開始處理業(yè)務邏輯
}
} else{
// $model->update('game_order', ['order_status'=>300],"order_num='$order_no'");
echo '支付失敗';
die;
}
}