PHP在微信支付开发中的重点分析 (php wechat)

教程大全 2025-07-16 02:29:02 浏览

微信支付是微信与财付通联合推出的创新移动支付产品。如今,随着微信Pay的全面开放,相关需求也越来越多。很多开发者在开发微信支付和商家申请微信支付时都面临着很多问题。本文将结合微信支付接口开发的实践,从支付应用到主接口的使用等方面探讨微信支付的关键技术。 URL设置

目前,微信支付只能由通过微认证的服务号进行申请,订阅号及未认证的服务号均无法申请。登录微信公众平台后台,你可以找到在左列“微信”,点击进入应用程序接口,你可以看到在项“商家基本信息”,点击“填写”按钮在右边,你会进入微信付款设置界面。 微信支付的目录和URL设置没有固定的方法,具体方法需要根据自己的需要来确定。表1是工作室的方案。

表1 微信支付目录及URL设置

需 要注意的是,如果使用上述方法,要将域名换成自己的域名,其他的结构及层次可不变。这里所有的URL没有填写实际的文件名,目的是为了兼容不同的开发语言 或框架。比如目录下的默认文件既可能是index.php,也可能是index.aspx。微信支付申请完成后,便进入了微信支付测试阶段,需要填写支付 测试目录,测试目录可以填写为:。

接口开发

JS API支付

JS API支付的实现比较简单,官方也提供了Demo,在此基础上修改部分参数即可。修改后的

一个示例如下:

上述代码中,主要修改了两个参数:notify_url为接收交易通知的路径,这个一定要改为自己 服务器 上的一个路径;spbill_create_ip为用户客户端的IP,不改关系也不大,不过改一下更规范些。

JS API支付是网页内的支付,通过调用微信支付控件来实现支付。如果要用作真实产品场景的支付,只需要修改一下产品名称及费用即可,对于涉及到快递费用的交易,需要注意订单的总金额为商品费用和物流费用的和。

如果微信支付时提示access Denied,通常有以下原因:参数填写不正确、支付目录结构不正确、没有加入白名单权限。需要对照检查一下,才能找到具体原因并进行纠正。

Native支付

Native(原生)支付就是常说的扫描二维码支付。这种支付首先需要商户定义符合Native支付规范的URL,也就是Native支付URL,同时在微信后台POST商户后台时需要提供package内容。

Native支付的开发分为三步。

生成Native支付的URL

Native支付URL是一系列具有“weixin://wxpay/bizpayurl?”前缀的URL,同时后面紧跟着一系列辨别商户的键值对。

原生URL由wxPayHelper类中的create_native_url()方法实现,实现代码如下:

其中productid是商品ID,开发人员需要定义并维护自己的商品ID,这个ID与一张订单等价,微信后台凭借该ID通过POST商户后台获取交易信息。上述代码生成的URL如下所示:

生成URL的二维码有了上述支付链接后,还要把它转成二维码,PHP QR Code是一个开源的二维码生成类库,可使用它来生成上述Native URL,代码如下:

PHP QR Code的使用很简单,配置一下URL和文件名就可以了。执行上述代码,就会在当前目录下生成一个1234567890.png的二维码图片文件。

Navive支付回调URL

在 前面说过,Native支付的回调URL设置为,当用户扫描上述二维码时,会 调用该回调URL。URL需要调用订单信息Package返回给用户,而该Package是由WxPayHelper类的 create_native_package()实现,调用代码如下:

上述代码中,参数的配置和JS API支付一样,只是最后调用的支付方式不一样。

与 此同时,微信公众平台将会向回调URL推送XML格式的数据。这些数据中包含签名字段,可以用来验证是否是真正的支付二维码,但这个验证的必要性不是很 大。而回调URL也会返回一个XML格式的数据给微用户,用户才能看到他所交易的商品信息的内容,这个XML的格式如下:

如果商品已过期或有其他错误,则可以在上述返回XML数据中的RetCode和RetErrMsg中体现出来。例如:RetCode为其他非0值,RetErrMsg为“该商品已下架”。

交易通知

在上述JS API或Native支付完成后,将向发送交易通知,并且带上URL参数,一个完整的带参数URL如下:

同时,微信还发送POST数据,XML格式如下:

注意,URL和XML中包含了此次交易的很多重要信息,其中有三项参数,分别是商户订单号out_trade_no,交易号transaction_id及XML数据中的OpenID,这几个参数将在后续很多接口中使用到。

订单查询

订单查询API的URL为:

h t t p s : / / a p i . w e i x i n . q q . c o m / p a y /orderquery?access_token=xxxxxx

URL中的参数只包含微信公众平台凭证access_token,而订单查询的真正数据是放在PostData中的,格式如下:

订 单查询这一接口,开发文档中并没有给出Demo,所以需要自己来实现。其中关键点是生成参数package中的sign和app_signature。其 中,sign是对参数字典序排序并使用“&”联合起来,最后加上&key=partnerkey(分配),进行md5运算,再转成全 大写,最终得到sign。而app_signature则是根据支付签名(paySign)生成方法中所讲的签名方式生成,参加签名字段为:appid、 appkey、package、timestamp。相关代码实现如下所示:

wechat

发货通知

发货通知API的URL为:

h t t p s : / / a p i . w e i x i n . q q . c o m / p a y /delivernotify?access_token=xxxxxx

URL中的参数只包含微信公众平台凭证access_token,而发货通知的真正数据放在PostData中,格式如下:

发 货通知也没有Demo,需要自己开发实现,其中的关键点也是生成app_signature,它根据支付签名(paySign)生成方法中所讲的签名方式 生成,参加签名字段为:appid、appkey、openid、transid、out_trade_no、deliver_timestamp、 deliver_status、deliver_msg。实现代码如下所示:

告警通知

告警通知的URL为申请微信支付时设置的,微信后台将向

维权通知

维 权通知的URL为申请微信支付时设置的,用户在新增投诉单及确认处理完毕投诉 后,微信后台都会向该URL推送包含PostData的XML数据, 数据中包含维权内容信息。维权通知是被动接收到的通知,接收到后,能使用模版消息提醒自己,以免错过处理时限。

标记投诉处理

标记客户投诉处理状态API的URL为:中的参数包含微信公众平台凭证access_token,客户投诉对应的单号feedbackid,以及OpenID。填好参数后访问该URL即可返回“标记成功”的通知。

收货地址共享

收 货地址共享的开发是微信支付开发中最复杂的部分,主要原因有:官方没有Demo;开发文档含糊不清;签名算法与之前的不一致,需要自己新实现;JS API回调后不能给出错误原因提示,调试没有方向感,需要开发者对高级接口中的OAuth2.0过程非常精通。收货地址共享的完整实现步骤如下。

设置授权回调域名

OAuth2.0授权页面域名的配置在公众平台网站→开发者中心→接口权限表→高级接口→OAuth2.0网页授权中设置,将域名设置成微信支付授权目录中的域名,如www.doucube.com。

构造请求授权回调URL

请求OAuth2.0授权的URL如下:

请求授权参数说明如表2所示。

表2 请求授权参数

这里,构造请求接口如下:

其 中,是获取共享收获地址的页面。作用域使用 snsapi_base,用户访问上述请求接口之后,将会跳转到页面/getaddress.php?code=02feab18436a5704c395c1b2e0451547&state=1。

获取共享收货地址

在getAddress.php页面,首先需要获取授权Access Token,这个Access Token是OAuth2.0授权时获得的,不是自定义菜单实现时的那个Access Toekn。实现代码如下:

然 后需要计算出地址签名,参与addrSign签名的字段包括:appid、url(当前网页URL,包含code和state参数)、 timestamp、noncestr、accessToken(用户OAuth2.0授权凭证)。这里scope、signType不参与签名。这是共 享收获地址中最关键的一步,它对所有待签名参数按照字段名ASCII码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1& amp;key2=value2……)拼接成字符串string1。然后对string1作签名算法,字段名和字段值都采用原始值,并进行URL转义。具 体签名算法为addrSign = SHA1(string1)。其代码如下:

所有字段的值都获取成功以后,就赋值成收货地址接口的JS API中的变量值。

其他接口

其 他接口还有退款接口、退款查询接口、对账单下载等,他们都有Demo,配置好后即可使用。其中要注意的就是退款接口的开发中pem证书的生成方法。在 退款接口的开发中,需要把pfx证书转换pem证书,转换后将pem文件作为私钥。这需要用到OpenSSL这一工具,一般Linux已自带该功能。在 Linux下的转换命令如下:

转换过程中需要输入商户ID来解密旧证书,然后设置新密码来加密新证书,新密码将在退款程序中配置使用。

总结

微信支付的开发文档中对部分关键技术阐述不详,不利于开发者快速理解上手。本文从申请微信支付时目录及URL设置到各种接口开发中的核心部分都做了讲解,希望能为微信支付的开发人员提供帮助,加快开发速度。


什么是面向结构的编程语言?什么是面向对象的编程语言?

面向对象的程序设计(Object-Oriented Programming,简记为OOP)立意于创建软件重用代码,具备更好地模拟现实世界环境的能力,这使它被公认为是自上而下编程的优胜者。 它通过给程序中加入扩展语句,把函数“封装”进编程所必需的“对象”中。 面向对象的编程语言使得复杂的工作条理清晰、编写容易。 说它是一场革命,不是对对象本身而言,而是对它们处理工作的能力而言。 对象并不与传统程序设计和编程方法兼容,只是部分面向对象反而会使情形更糟。 除非整个开发环境都是面向对象的,否则对象产生的好处还没有带来的麻烦多。 有人可能会说PHP不是一个真正的面向对象编程的语言, PHP 是一个混合型 语言,你可以使用面向对象编程,也可以使用传统的过程化编程。 然而,对于大型项目的开发,你可能想需要在PHP中使用纯的面向对象编程去声明类,而且在你的项目开发只用对象和类。 随着项目越来越大,使用面向对象编程可能会有帮助,面向对象编程代码很容易维护,容易理解和重复使用,这些就是软件工程的基础。 在基于Web的项目中应用这些概念就成为将来网站成功的关键。 对象(Object)是问题域或实现域中某些事物的一个抽象,它反映此事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。 关于对象要从两方面理解:一方面指系统所要处理的现实世界中的对象;另一方面对象是计算机不直接处理的对象,而是处理相应的计算机表示,这种计算机表示也称为对象。 简单的来说,一个人就是一个对象,一个尺子也可以说是个对象。 当这些对象可以用数据直接表示时,我们就称他为属性,尺子的度量单位可以是厘米,公尺或英尺,这个度量单位就是尺子的属性。 在PHP里我们可以定义一个类,类(Class)就是指变量与一些使用这些变量的函数的集合。 PHP是一种松散类型的语言,所以通过类型重载不起作用,通过参数的个数不同来重载也不起作用。 有时在面向中重载构造函数非常好,这样你可以通过不同的方法创建对象(传递不同数量的参数)。 在PHP中就是通过类来实现的。

PHP,3G手机编程,嵌入式开发的前景。

一、PHP的前景

PHP是一种开发语言,主要应用在网站开发,目前国内,包括Google、网络、网易、新浪、搜狐、阿里巴巴、奇虎、eBay、腾讯、Yahoo、金山等的各大网站都在寻求PHP高手。 今年各类企业发布招聘PHP人才信息,对人才的需求超过600名,但是因为国内PHP人才贮备的不足、培训体系的不健全以及国内Web开发人员对PHP的价值认识不够,我们看到个人的应聘累计只有60名,人才的缺口竟然是10:1,PHP人才非常稀缺。

二、3G手机编程的前景

应用领域主要是手机开发领域,是目前最火的技术之一。 2009年,3G手机市场处于持续升温状态。 2009年上半年国内3G手机市场整体销量范围仅为22万部。 2009年11月,3G手机销量高达117.6万台,首次单月突破100万,成为3G市场发展的“分水岭”。 当月,TD-SCDMA手机销量增幅最大,达到74.7%,EVDO增幅36.5%,WCDMA手机11月增幅相对较小。 根据中国工业和信息化部的统计数据,截至2009年10月底,中国3G用户总数为977万,其中TD-SCDMA手机用户数已达394万,约占全国3G用户总数的四成。

在3G产业链中,电信运营商是产业链的主导,因为大部分运营商都以定制手机作为自身的发展策略,在终端采购方面,运营商能够结合自己所提供的、将提供的电信服务让终端制造商根据自身的需求提供相应定制的终端,这跟2G的产业链有较为明显的区别。 手机定制成为3G产业链的一大亮点。 国内不少厂商具备生产各种3G手机终端的能力,但3G手机终端厂商需要具有良好的研发创新能力和持续满足电信运营商需求的能力,才能在未来激烈的竞争中生存。

3G业务包括手机游戏、手机阅读、无线音乐等。 其他具备发展潜力的3G 业务有移动SNS、移动电子商务、移动位置服务、移动搜索引擎、手机动漫、可视电话、手机电视等。 2009年,由于中国手机浏览器市场尚处于市场发展初期,众多的手机浏览器厂商现阶段的营收主要来自于为终端厂商、电信运营商等提供技术支持。 虽然手机浏览器已成为炙手可热的概念,但手机自带浏览器仍占据一半的移动互联网用户市场。 用户下载安装的浏览器,依然有很大的发展空间。

三、嵌入式开发的前景近几年嵌入式软件行业迅猛发展,嵌入式产品渗入各个行业,象常见到的手机、PDA、机顶盒、高清电视(HDTV)、路由器、汽车电子、数码相机、医疗仪器、航天航空设备等等都是典型的嵌入式系统,嵌入式开发已 经成为当前最热门最有发展前途的行业之一。 自2001年以来,国内越来越多的房地产项目打出了“宽带智能化”等旗号,宽带到户已是住宅装修时必须考虑的问题。 然而如何才能让你的家真正实现智能化呢?业内人士认为,目前嵌入式行业至少存在30-50万的人才缺口,仅北京市场嵌入式软件开发人员的需求就已经超过了5万人,而且还在持续增加,目前在北京,一个成熟的嵌入式软件工程师平均月薪在元左右。 四、PHP,3G手机编程,嵌入式开发的区别与相同点三者都是在目前炙手可热,且前景都非常不错。 三者最大的区别是从事的行业与领域不同,所以最重要的是看楼主想从事什么样的工作,想进入互联网公司,做网站开发,还是从事通讯做3g手机开发,或者是应用领域最广的嵌入式行业!

在node.js领域中哪一个框架用来架构API比较好

程序 or 框架?程序是已经成型的应用,你需要的是为它搭建环境、添加配置,然后就可以运行起来;框架则是应用的骨架,你需要为它添加数据模型、业务逻辑,它才能成为应用,开始提供服务。 事实上,对于Web开发来说,程序和框架的区别正越来越模糊,比如几乎妇孺皆知的Wordpress,它是一个博客程序,但它丰富的插件以及高度的 自定义能够支持很大程度上的二次开发,在这点上它比起一些PHP框架也并不逊色。 我个人认为,如果重心在于提供服务而不是掌握技术,有WordPress 这样的程序是没有必要使用框架的。 可惜的是,由于Nodejs还很年轻,目前还没有WordPress这样的程序,因此目前在开发里,如果想做出自己想要的作品,框架是必然的选择。 如果是某些特定类型的应用,可以尝试一些开源的程序,比如要用Nodejs做博客,有Hexo、Ghost等。 回到顶部 Web框架有哪些?里的Web框架分为API框架和Web应用框架。 前者能够开发出RESTful的API,后者也能开发出RESTful API,但还包括模板、渲染等为前端所准备的功能。 API框架的使用场景是为跨平台应用提供统一的数据模型,而渲染由前端/客户端自行解决。 目前比较知名的API框架有restify(文档、Github、NPM)(官网、Github、NPM)LoopBack(官网、Github、NPM)Frisby(官网、Github、NPM)(官网、Github、NPM)Web应用框架顾名思义,就是为了打造Web应用所开发的框架。 这里有两种风格的Web应用框架。 一个是Sinatra风格,另一个是Rails风格。 Sinatra和Rails都是Ruby语言的Web框架,后者的影响力更大也更为知名。 这里简单的解释一下两种风格是什么意思。 Sinatra风格是指高度可配置,注重开发的自由度。 代表性的Nodejs Web框架有:Express(官网、Github、NPM)TJ大神开发,官方推荐 hapi(官网、Github、NPM)(官网、Github、NPM)flaliron(官网、Github、NPM)(官网、Github、NPM)locomotive(官网、Github、NPM)Rails风格则是指不重复自己和约定优于配置,以及严格遵循MVC结构开发。 代表性的框架有(官网、Github、NPM)geddy(官网、Github、NPM)CompoundJS(官网、Github、NPM) 原railswayjs这两种风格无所谓谁优谁劣,全凭使用者的偏好。 而在这两种Web框架之外,还有更大型的框架,即全栈框架,其中的代表是MEAN。 回到顶部MEAN?MEAN指mongoDB+Express++,这一组合包括运行环境、数据库、Web框架和前端引擎。 被称为 全栈框架(Full-stack Framework)。 这其中除了之外,每一个都是可替换的,目标是创建从前端到后端,全部使用javascript的Web应用。 由于这一框架的完善性,有人将其称为LAMP的接班人。 LAMP即PHP的典型运行环境,Linux+Apache+MySql+PHP,被大量的用于各种虚拟主机上。 MEAN看似庞大,但事实上要构建完整的现代化Web应用,特别是SPA(单页面应用),这几个组件都是难以缺少的,并且,其中每一项几乎都是目前 情况下的最佳选择,因此用于学习和重头开始打造新的Web应用是非常合适的。 但由于实际业务的独特性,很可能要替换其中的组件,比如用Mysql来替换 MongoDB,因此,学习其中的原理和架构,打造自己的类MEAN框架也是一种选择。 作为个人和小团队来说,全栈框架MEAN基本上足够了,但目前大多数全栈框架还包含一项特性,那就是实时,拥有实时功能的框架我们又称为实时框架。 回到顶部实时框架好吗?实时框架(Real-time framework)指包含了webSocket的双向通信功能,能够在服务器和客户端做到实时通信的框架。 服务端和客户端自由通信的需求一直都在,但由于HTTP协议本身的局限性,因此催生了Comet等变通的方法,但即使这样也离实时相距甚远。 而当 兴起后,另一个HTML5技术webSocket也渐渐成熟,人们突然发现,实时通信一下子变得触手可及,于是webSocket技术在 中得到大量的应用,其中最为知名的模块就是,而各种全栈框架也纷纷加入实时特性来应对更广阔的开发需求。 目前有代表性的实时框架有:Meteor(官网、Github、NPM)(官网、Github、NPM)Derby(官网、Github、NPM)SocketStream(官网、Github、NPM)不过说实话,目前能看到的实时通信的应用场景其实不多,其中大多集中于聊天室、to-do、实时图表、在线游戏等领域。 其他领域使用实时特性不但没必要,而且是对服务器资源的浪费。 因此目前是否要采用实时框架,要看具体的项目而定。 以上基本就是 Web框架的现状了,相信看到这里,对于选择何种框架读者已经心里有数了吧。 最后再介绍一个容易搞混的概念,和解释一下我的选择。 回到顶部YEOMAN?第一次见到这个词,我还以为它和MEAN有什么联系。 事实上,它们是截然不同的两个东西。 YEOMAN由YO(脚手架)、grunt(构建工具)、bower(包管理器),它代表的是一种工作流,与框架开发的思维方式完全不同。 具体的介绍可见这里。 YEOMAN能够和框架达到类似的目的,都是为构建一个Web应用做好准备,但是要不要采用YEOMAN,则是见仁见智。 我个人的看法是,学习 YEOMAN本身就需要不少时间,并且有一定的学习门槛。 至少在目前,使用框架开发还是相对经济的,而如果以后YEOMAN这种模式推广开来,再来学习也 不迟,更何况有一定的项目经验之后再来学习YEOMAN要轻松很多。 事实上,我还是很认可YEOMAN这种Generator+package Manager的模式的,这是因为本身崇尚微模块的 概念,即无论是多么小的功能,都将它们模块化,甚至大的模块也要拆分成小的模块,然后通过搭积木的方式来构建应用。 这样能够彻底的解耦,对于不容易调试的 Javascript来说,也有助于定位和修复应用中的问题。 Generator就是这种理念催生下的产物,通过选择不同的配置和选项,将积木搭起来。 不 过对于这种模式目前大家也还处于实验当中,不急于进行实际应用。 回到顶部为什么我选择了Hackathon Starter?在我的个人项目中,使用的是Hackathon Starter,一个 Web应用脚手架。 我使用它的原因是,要求高度可配置,同时又讨厌写一些配置的代码,因此它对于我来说是很好的选择。 一些全栈框架对我来说,封装过多,将原生的 /Express API隐藏掉了,要使用还需要一定的学习成本。 而Express这样的框架又太过简洁,在实际的项目中使用还需要大量的插件和配置,而这些在 Hackathon Starter中都已经帮我们做好了,同时还有一些示例代码以供学习,对于新人来说非常友好,可以避免过多的挫折感。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐