博客: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支付技术架构全解析相关推荐

  1. 爱聊天(LoveChat)即时通讯聊天APP系统——技术架构

    爱聊天(LoveChat)即时通讯聊天APP系统--技术架构 公司旗下第三代即时通讯产品 第一代:阿卡信 https://gitee.com/openzaly/akaxin-openzaly 第二代: ...

  2. 微信和支付宝APP支付使用总结

    微信和支付宝APP支付使用总结 一.微信支付 1.先到微信开放平台注册账号.通过开发者认证. 2.创建应用,该应用也就是你的app,并提交审核. 3.审核后,应用详情下面有接口信息->微信支付- ...

  3. 移动支付技术架构及应用模式探讨

    随着银行卡芯片化全面推进.移动通讯网络的蓬勃发展以及智能手机的快速普及,以移动支付为基础的移动金融已逐渐进入金融服务民生领域.现对移动支付技术架构尤其是基于金融IC卡的移动支付技术模式进行探讨. 一. ...

  4. 《架构真经:互联网技术架构的设计》大道至简

    本节书摘来自华章出版社<架构真经:互联网技术架构的设计>一书中的第1章,第1节,作者 小象学院 杨 磊,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 大道至简 ...

  5. 【Android】相对布局(RelativeLayout)最全解析

    [Android]相对布局(RelativeLayout)最全解析 一.相对布局(RelativeLayout)概述 二.根据父容器定位 三.根据兄弟控件定位 一.相对布局(RelativeLayou ...

  6. 【Android】线性布局(LinearLayout)最全解析

    [Android]线性布局(LinearLayout)最全解析 一.LinearLayout概述 二.LinearLayout常用属性 2.1 orientation属性 2.2 gravity属性 ...

  7. 微信视频号实时推荐技术架构分享

    推荐阅读: 世界的真实格局分析,地球人类社会底层运行原理 不是你需要中台,而是一名合格的架构师(附各大厂中台建设PPT) 企业IT技术架构规划方案 论数字化转型--转什么,如何转? 华为干部与人才发展 ...

  8. 微信直播服务器架构,音视频直播--技术架构—易龙天

    今天和大家讲一下音视频直播技术架构.之前的关注点主要放在客户端如何采集音频数据上,经过这两天的思考,我觉得应该先给大家讲一下音视频直播技术架构,这样更容易从整体上理解视频直播技术是如何运转的,之后再逐 ...

  9. Google App Engine技术架构之Google App Engine的简介

    通过前面两篇Google的核心技术和Google整体架构猜想,大家应该对Google强大的基础设施有一定的了解.本篇开始介绍构筑在这强大基础设施之上的Google App Engine. Google ...

最新文章

  1. ubuntu命令安装jdk
  2. python中面向切片编程(AOP)和装饰器
  3. 运维与自动化运维发展概括
  4. php 正三角塔,PHP 环境塔建与数据类型转换
  5. 自已脚本开发常用的底层方法
  6. MySQL索引优化分析
  7. 修改SQL Service数据库排序规则
  8. Oracle数据库性能问题分析的一种常规思路
  9. Python OOP:面向对象基础,定义类,创建对象/实例,self,创建多个对象,添加对象属性,访问对象属性,__init__方法,带参数的__init__,__str__方法,__del__方法
  10. Mysql学习总结(31)——MySql使用建议,尽量避免这些问题
  11. (原创)我眼中的设计模式系列之外观模式(二)
  12. 本地windows下新建kafka生产消费数据
  13. 华为鸿蒙联合品牌,魅族官宣:接入华为鸿蒙!这是国产智能手机品牌的首个公开表态!...
  14. 操作系统 第二部分 进程管理(六)
  15. 诗词乱拼 zz from smth.org
  16. java正则表达式过滤特殊字符_使用Java正则表达式过滤特殊字符
  17. java宝典 pdf下载_Java面试宝典2020修订版 PDF 下载
  18. 用python画星空-python3的turtle画模仿3d星空,运动的恒星小宇宙
  19. 电子书下载:Adobe PDF 文档格式开发参考 PDF Reference 1.7
  20. Linux修改主机名(静态主机名、临时主机名)

热门文章

  1. Linux——进程管理(crontab实例傻瓜教程)
  2. Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短信/七牛云存储
  3. pdf翻译器哪个好?这几个pdf翻译软件能支持一键翻译
  4. 简述你对人工智能未来发展的看法?
  5. 3. lambda 方法引用
  6. Netural Machine Translation By Joinly Learning To Align And Translate
  7. 编程学习应用 Growth 发布 3.0,在碎片时间里练习
  8. 这可能是你能找到最全面的数据预处理介绍
  9. siesta在Linux运行,并行版的SIESTA不能运行
  10. bbs.ncar forum.php,无删减又好看的美剧资源网站