android 微信架构,微信App支付技术架构全解析
博客:http://www.jianshu.com/users/21716b19302d/latest_articles
簡單介紹了微信移動支付的申請、接入、使用、確認支付結果等相關流程
1 申請
申請步驟直接參考官方文檔-http://kf.qq.com/faq/120911VrYVrA150906F3qqY3.html
主要2個大塊:申請開通開放平臺
申請支付開通商戶平臺
全部申請通過后,獲取支付必須的參數如下:
1.1 AppID和AppSecret
開放平臺創建的應用唯一標識。 登錄微信開放平臺,進入應用詳情可查看AppID和AppSecret。
1.2 mch_id
微信支付申請完成之后,微信商戶平臺會給你的郵箱發通知郵件,里面包含開通支付的商戶信息
1.3 API秘鑰
即商戶支付秘鑰,主要負責處理通信相關參數加密。登陸微信商戶平臺(賬號密碼在微信商戶平臺發來的郵件里) 點擊左側的「賬戶設置 - API 安全」(第一次登陸會讓你安裝操作證書,請先安裝操作證書)。點擊設置密鑰,設置自己的密鑰。
1.4 商戶證書
用于退款等一些需要證書驗證的接口使用。在微信商戶平臺點擊「賬戶中心?- API 安全」,點擊「下載證書」
證書下載后,打開壓縮包會看到「apiclientcert.pem」和「apiclientkey.pem」和rootca.pem證書。
2 接入流程
參考接入文檔-https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1
主要幾個步驟:統一下單(放在服務端,需要加密參數)
生成支付參數(放在服務端,需要生成簽名)
調用客戶端SDK發起支付
服務端異步接收支付結果
2.1 統一下單
$appid = ''; ?//你的appid$mch_id = ''; ?//商戶id$wx_api_key = ''; ? ?//商戶api秘鑰$out_trade_no = ''; ?//自己業務系統生成的交易no,可以唯一標識$client_ip = ''; ?//客戶端ip$notify_url = ''; ? ?//接收支付結果通知url$UNIFIED_ORDER_URL = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; ?//統一下單地址$data = array();$data['appid'] = $appid; $data['mch_id'] =$mch_id;$data['nonce_str'] = randomStr(20); ?//隨機20位字符串$data['body'] = '微信移動支付測試';$data['detail'] = '微信移動支付測試';$data['out_trade_no'] = $out_trade_no; ? ?$data['total_fee'] = 1; ?//注意 單位是分$data['spbill_create_ip'] = $client_ip;$data['notify_url'] = $notify_url;$data['trade_type'] = 'APP'; ?//交易類型$data['sign'] =sign($data, $wx_api_key); ? ?//簽名//轉為xml格式$xml_str = arrayToXmlStr($data); //發送請求 使用封裝好的curl_post$result = curl_post($UNIFIED_ORDER_URL, $xml_str);//解析得到的值$get_data = simplexml_load_string($raw_data, 'SimpleXMLElement', LIBXML_NOCDATA);$get_para = array();$get_sign = '';foreach ($get_data->children() as $child) { ? ? ? ?if($child->getName() == 'sign') { ? ? ? ? ? ? ? ?$get_sign = strval($child); ? ? ? ?} else { ? ? ? ? ? ? ? ?$get_para[strval($child->getName())] = strval($child); ? ? ? ?}}if($get_para['return_code'] !== 'SUCCESS') { ? ?//return code fail}//驗證簽名if(!verifySign($get_sign, $get_para, $wx_api_key)) { ? ?//驗證簽名非法}//可以自行處理解析獲得的參數//todo...
一些函數:
/** * array轉成xml str * @param $arr */public static function arrayToXmlStr($arr) { ? ? ? ?$xml_data = new \SimpleXMLElement(''); ? ? ? ?Func::arrayToXml($arr, $xml_data); ? ? ? ?return $xml_data->asXML();}/** * 生成指定長度的隨機字符串(包含大寫英文字母, 小寫英文字母, 數字) * @param $length int 需要生成的字符串的長度 * @return string 包含 大小寫英文字母 和 數字 的隨機字符串 */public static function randomStr($length){ ? ? ? ?//生成一個包含 大寫英文字母, 小寫英文字母, 數字 的數組 ? ? ? ?$arr = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z')); ? ? ? ?$str = ''; ? ? ? ?$arr_len = count($arr); ? ? ? ?for ($i = 0; $i < $length;="" $i++)="" ?="" ?{="" ?="" ?="" ?="" ?="" ?="" ?="" ?="" ?$rand="mt_rand(0," $arr_len-1);="" ?="" ?="" ?="" ?="" ?="" ?="" ?="" ?$str.="$arr[$rand];" ?="" ?="" ?="" ?}="" ?="" ?="" ?="" ?return="" $str;}/**="" *="" 微信簽名="" *="" @param="" $para="" mixed="" 帶簽名參數數組="" *="" @param="" $wx_key="" string="" wxkey="" */public="" static="" function="" sign($para,="" $wx_key)="" {="" ?="" ?="" ?="" ?$unsign_str="Func::createLinkString(Func::argSort($para))" .="" '&key=' . $wx_key; ? ? ? ?$sign = strtoupper(md5($unsign_str)); ? ? ? ?return $sign;}/** * 微信簽名驗證 * @param $sign * @param $para * @param $wx_key * @return false-驗證失敗 true-驗證成功 */public static function verifySign($sign, $para, $wx_key) { ? ? ? ?$unsign_str = Func::createLinkString(Func::argSort($para)) . ' &key=' . $wx_key; ? ? ? ?$sign_str = strtoupper(md5($unsign_str)); ? ? ? ?if($sign === $sign_str) { ? ? ? ? ? ?return true; ? ? ? ?} ? ? ? ?return false;}
2.2 生成支付參數
客戶端需要的支付參數是帶簽名的,所以最好支付參數也在服務端生成后,jsondecode后傳入客戶端即可直接調用
//生成支付參數$data = array();$data[' appid']="$appid;" $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="">
3. 調用支付
3.1 Android
注:微信支付在開放平臺中填入應用對應的包名和簽名,并且測試時要簽名打包,不然支付失敗
可以直接參考調用我二次封裝過的Android SDK。 Github地址:https://github.com/tsy12321/PayAndroid
3.2 iOS
二次封裝過的iOS SDK。 Github地址:https://github.com/tsy12321/PayiOS
4 異步結果通知
注:尤其要注意通知結果驗證成功后要能正確處理重復通知,放置多次發貨造成資金損失
$raw_data = $GLOBALS['HTTP_RAW_POST_DATA'];$get_data = simplexml_load_string($raw_data, 'SimpleXMLElement', LIBXML_NOCDATA);$get_para = array();$get_sign = '';foreach ($get_data->children() as $child) { ? ? ? ?if($child->getName() == 'sign') { ? ? ? ? ? ? ? ?$get_sign = strval($child); ? ? ? ?} else { ? ? ? ? ? ? ? ?$get_para[strval($child->getName())] = strval($child); ? ? ? ?}}if($get_para['return_code'] !== 'SUCCESS') { ? ?//return code fail ? ?die('');}//驗證簽名if(!verifySign($get_sign, $get_para, $wx_api_key)) { ? ?//驗證簽名非法 ? ?//todo ? ?die('');}//在這其實通知已經接受成功 可以返回成功告訴微信不用再次通知了echo('');//業務狀態碼判斷if ($get_para['result_code'] !== 'SUCCESS') { ? ? ? ? ?//狀態碼錯誤 ? ?//支付錯誤 更改訂單狀態 記錄log等 ? ?//...}//支付成功 更改訂單狀態 記錄log等 //todo
5 其他客戶端收到同步支付結果后建議一段時間內輪詢檢查服務端,獲取服務端的結果,支付最終狀態以服務端為準
總結
以上是生活随笔為你收集整理的android 微信架构,微信App支付技术架构全解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 事务的四大属性ACID即事务的原子性(A
- 下一篇: 微信支付终于成功了(安卓,iOS),在此