微信App支付全解析

2021-09-11 12:36:06 字數 3518 閱讀 3713

系列五 支付寶即時到賬支付全解析

系列七 支付寶退款全解析

系列八 支付寶開放平台支付更新公升級全解析

申請步驟直接參考官方文件

主要2個大塊:

申請開通開放平台

申請支付開通商戶平台

全部申請通過後,獲取支付必須的引數如下:

paste_image.png

paste_image.png

1.2 mch_id

paste_image.png

1.3 api秘鑰

paste_image.png

1.4 商戶證書

paste_image.png

主要幾個步驟:

統一下單(放在服務端,需要加密引數)

生成支付引數(放在服務端,需要生成簽名)

呼叫客戶端sdk發起支付

服務端非同步接收支付結果

2.1 統一下單

$mch_id = ""; //商戶id

$wx_api_key = ""; //商戶api秘鑰

$out_trade_no = ""; //自己業務系統生成的交易no,可以唯一標識

$client_ip = ""; //客戶端ip

$notify_url = ""; //接收支付結果通知url

$unified_order_url = ""; //統一下單位址

$data = array();

$data['mch_id'] =$mch_id;

$data['nonce_str'] = randomstr(20); //隨機20位字串

$data['out_trade_no'] = $out_trade_no;

$data['total_fee'] = 1; //注意 單位是分

$data['spbill_create_ip'] = $client_ip;

$data['notify_url'] = $notify_url;

$data['sign'] =sign($data, $wx_api_key); //簽名

//轉為xml格式

$xml_str = arraytoxmlstr($data);

//傳送請求 使用封裝好的curl_post

$result = curl_post($unified_order_url, $xml_str);

//解析得到的值

$get_data = ******xml_load_string($raw_data, '******xmlelement', libxml_nocdata);

$get_para = array();

$get_sign = "";

foreach ($get_data->children() as $child)

else

}if($get_para['return_code'] !== "success")

//驗證簽名

if(!verifysign($get_sign, $get_para, $wx_api_key))

//可以自行處理解析獲得的引數

//todo...

複製**

一些函式:

/**

* array轉成xml str

* @param $arr

*/public

static

function

arraytoxmlstr

($arr)

/** * 生成指定長度的隨機字串(包含大寫英文本母, 小寫英文本母, 數字)

* @param $length int 需要生成的字串的長度

* @return string 包含 大小寫英文本母 和 數字 的隨機字串

*/public

static

function

randomstr

($length)

return $str;

}/**

* @param $para mixed 帶簽名引數陣列

* @param $wx_key string wxkey

*/public

static

function

sign

($para, $wx_key)

/** * @param $sign

* @param $para

* @param $wx_key

* @return false-驗證失敗 true-驗證成功

*/public

static

function

verifysign

($sign, $para, $wx_key)

return

false;

}複製**

2.2 生成支付引數

客戶端需要的支付引數是帶簽名的,所以最好支付引數也在服務端生成後,jsondecode後傳入客戶端即可直接呼叫

//生成支付引數

$data = array();

$data['mch_id'] =$mch_id;

$data['prepayid'] = $prepayid; //剛才統一下單生成的prepayid

$data['package'] = "sign=wxpay";

$data['noncestr'] = randomstr(20);

$data['timestamp'] = time();

$data['sign'] =sign($data, $wx_api_key);

$pay_param = json_encode($data);複製**

注:尤其要注意通知結果驗證成功後要能正確處理重複通知,放置多次發貨造成資金損失

//驗證簽名

if(!verifysign($get_sign, $get_para, $wx_api_key))

echo("");

//業務狀態碼判斷

if ($get_para['result_code'] !== 'success')

//支付成功 更改訂單狀態 記錄log等

//todo

複製**客戶端收到同步支付結果後建議一段時間內輪詢檢查服務端,獲取服務端的結果,支付最終狀態以服務端為準

微信app支付

商戶id public static final string partner id 14698sdfs402dsfdew402 常量固定值 public static final string grant type client credential 獲取預支付id的介面url public st...

微信app支付

文件 arr mchid mchid,nonce str str random 32 隨機數 partner trade no order id,自己定義乙個不重複訂單號 check name no check desc desc,spbill create ip request getclient...

微信APP支付

final string mchid,final string notifyurl,final string outtradeno,final string noncestr,final string body,final string productid,final string totalfee...