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支付技术架构全解析相关推荐
- 爱聊天(LoveChat)即时通讯聊天APP系统——技术架构
爱聊天(LoveChat)即时通讯聊天APP系统--技术架构 公司旗下第三代即时通讯产品 第一代:阿卡信 https://gitee.com/openzaly/akaxin-openzaly 第二代: ...
- 微信和支付宝APP支付使用总结
微信和支付宝APP支付使用总结 一.微信支付 1.先到微信开放平台注册账号.通过开发者认证. 2.创建应用,该应用也就是你的app,并提交审核. 3.审核后,应用详情下面有接口信息->微信支付- ...
- 移动支付技术架构及应用模式探讨
随着银行卡芯片化全面推进.移动通讯网络的蓬勃发展以及智能手机的快速普及,以移动支付为基础的移动金融已逐渐进入金融服务民生领域.现对移动支付技术架构尤其是基于金融IC卡的移动支付技术模式进行探讨. 一. ...
- 《架构真经:互联网技术架构的设计》大道至简
本节书摘来自华章出版社<架构真经:互联网技术架构的设计>一书中的第1章,第1节,作者 小象学院 杨 磊,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 大道至简 ...
- 【Android】相对布局(RelativeLayout)最全解析
[Android]相对布局(RelativeLayout)最全解析 一.相对布局(RelativeLayout)概述 二.根据父容器定位 三.根据兄弟控件定位 一.相对布局(RelativeLayou ...
- 【Android】线性布局(LinearLayout)最全解析
[Android]线性布局(LinearLayout)最全解析 一.LinearLayout概述 二.LinearLayout常用属性 2.1 orientation属性 2.2 gravity属性 ...
- 微信视频号实时推荐技术架构分享
推荐阅读: 世界的真实格局分析,地球人类社会底层运行原理 不是你需要中台,而是一名合格的架构师(附各大厂中台建设PPT) 企业IT技术架构规划方案 论数字化转型--转什么,如何转? 华为干部与人才发展 ...
- 微信直播服务器架构,音视频直播--技术架构—易龙天
今天和大家讲一下音视频直播技术架构.之前的关注点主要放在客户端如何采集音频数据上,经过这两天的思考,我觉得应该先给大家讲一下音视频直播技术架构,这样更容易从整体上理解视频直播技术是如何运转的,之后再逐 ...
- Google App Engine技术架构之Google App Engine的简介
通过前面两篇Google的核心技术和Google整体架构猜想,大家应该对Google强大的基础设施有一定的了解.本篇开始介绍构筑在这强大基础设施之上的Google App Engine. Google ...
最新文章
- ubuntu命令安装jdk
- python中面向切片编程(AOP)和装饰器
- 运维与自动化运维发展概括
- php 正三角塔,PHP 环境塔建与数据类型转换
- 自已脚本开发常用的底层方法
- MySQL索引优化分析
- 修改SQL Service数据库排序规则
- Oracle数据库性能问题分析的一种常规思路
- Python OOP:面向对象基础,定义类,创建对象/实例,self,创建多个对象,添加对象属性,访问对象属性,__init__方法,带参数的__init__,__str__方法,__del__方法
- Mysql学习总结(31)——MySql使用建议,尽量避免这些问题
- (原创)我眼中的设计模式系列之外观模式(二)
- 本地windows下新建kafka生产消费数据
- 华为鸿蒙联合品牌,魅族官宣:接入华为鸿蒙!这是国产智能手机品牌的首个公开表态!...
- 操作系统 第二部分 进程管理(六)
- 诗词乱拼 zz from smth.org
- java正则表达式过滤特殊字符_使用Java正则表达式过滤特殊字符
- java宝典 pdf下载_Java面试宝典2020修订版 PDF 下载
- 用python画星空-python3的turtle画模仿3d星空,运动的恒星小宇宙
- 电子书下载:Adobe PDF 文档格式开发参考 PDF Reference 1.7
- Linux修改主机名(静态主机名、临时主机名)
热门文章
- Linux——进程管理(crontab实例傻瓜教程)
- Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短信/七牛云存储
- pdf翻译器哪个好?这几个pdf翻译软件能支持一键翻译
- 简述你对人工智能未来发展的看法?
- 3. lambda 方法引用
- Netural Machine Translation By Joinly Learning To Align And Translate
- 编程学习应用 Growth 发布 3.0,在碎片时间里练习
- 这可能是你能找到最全面的数据预处理介绍
- siesta在Linux运行,并行版的SIESTA不能运行
- bbs.ncar forum.php,无删减又好看的美剧资源网站