为什么每次冲游戏都需要付款信息 微信如何与付款方联系里有钱也不能冲

拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3c733f79f05e4370-ua98).
重新安装浏览器,或使用别的浏览器为什么微信钱包里面有钱但不能用,每次付款的时候都现实要银行卡_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
为什么微信钱包里面有钱但不能用,每次付款的时候都现实要银行卡
我有更好的答案
请支付密码的页面,底部有一行小字,使用***银行卡,后面有“更换”两个字,是绿色的,就可以先钱包里的零钱了,点一下
采纳率:20%
应该是可以选择的吧,付钱的时候显示的英航卡哪里你点一下,应该可以选择零钱支付的,你试一下
你的微信钱包没有绑定银行卡吧
微信己经出现问题,有朋友也出现你这种情况只能收款不能支付,钱又拿不出来,就连银行卡也没办绑定
2条折叠回答
为您推荐:
其他类似问题
银行卡的相关知识
换一换
回答问题,赢新手礼包为什么微信第一批小程序没有游戏?- 百度派
{{ mainData.uname }}
:{{ mainData.content }}
{{ prevData.uname }}
:{{ prevData.content }}
{{ mainData.uname }}
:{{ mainData.content }}
0 || contentType !== 1" class="separate-line">
:{{ item.content }}
获取百度派权限,参与更多问答互动
3">等{{ uList.length }}人邀请你回答
为什么微信第一批小程序没有游戏?
问题说明(可选):
扫一扫分享到微信
{{ log.sign }}
可能对你的问题感兴趣
暂无相关用户
,才能邀请用户
,才能邀请用户
你已邀请15人,不可再邀请
,月上柳梢头,人约黄昏后。
谈起微信小程序我就不得不叹一口气了,因为我也尝试过开发一个小程序,作为一个非专业人员其中的艰难我还是比较清楚。虽然对于专业的队伍来说开发一个小程序可能并不成问题,但是恰恰因为专业也是问题所在...
谈起微信小程序我就不得不叹一口气了,因为我也尝试过开发一个小程序,作为一个非专业人员其中的艰难我还是比较清楚。虽然对于专业的队伍来说开发一个小程序可能并不成问题,但是恰恰因为专业也是问题所在。我记得微信和苹果关于赞赏功能是否需要收取30%得手续费之争以后,腾讯就正式开放了小程序的限制,这个时候才呈现了小程序的井喷之势,而我也在这个时候开始做微信公众号。当时小程序处于风口浪尖了,为了提高我的公众号的吸引力,我也尝试着去做一个微信公众号。我在大学里面学过C++,有一定的编程基础,但是对于小程序还是一无所知的。于是我去看那个微信公众平台上的简易教程,从头开始读起,慢慢看其中的各个代码表示的意思。然后这还不够,这只是微信小程序开发助手的一个最简单的,下载之后就会有一个现有的简易小程序让你学习。所以我就在网上看各种资料,想要做一个天气预报之类的小程序。可是这需要很多,api,服务器,加密字段等等,都有很多的问题,因为小程序是基于h5的,改了又改,总算好了。因此我发现了很多问题,这也有可能就是第一批小程序没有游戏的原因。①微信小程序的体积包不能过大,要满足即用即走的特性,好像我做的那个才几百KB。但是一个游戏就不一样了,最基本的俄罗斯方块,推箱子等游戏的体积一般而言都是比较高的,因为需要加载更多的游戏图形模块,对于用户来说加载速度不快的话是会影响耐烦度的。②基于https的服务器,国内支持https的服务网站还不算很多,而且很多游戏想要获取互联网服务就必须要有api,而很多游戏公司恰恰是不提供api的。③相对于小程序的游戏而言,终端的游戏或者完整的游戏端能获取更多的收入和信息。腾讯对小程序的类目还不算很完整的支持,比如你想要做一个记事本类的是不可能的,审核不会通过,因为这会涉及用户的隐私信息。还有其他的。比如发现,就是发一些新奇的东西,都会不能通过审核。因此游戏是不会被审核通过的。④小程序基于的h5目前还有很多的不足之处,开发难度大,且投入小于产出。
扫一扫分享到微信
,我始终相信努力奋斗的意义
微信小程序为什么没有上线小程序,这也是我一直思考的问题,游戏市场作为一个这么大的市场为什么不上线呢,我想可能有以下几方面的原因。微信小程序说白了就是一个平台,就像阿里巴巴是卖家平台,滴滴是汽...
微信小程序为什么没有上线小程序,这也是我一直思考的问题,游戏市场作为一个这么大的市场为什么不上线呢,我想可能有以下几方面的原因。微信小程序说白了就是一个平台,就像阿里巴巴是卖家平台,滴滴是汽车的平台一样,小程序不过有点特殊,是各种手机app的平台,现在很多游戏并没有接入进来,一是游戏的数据包太大,动不动就是几个g,而且好玩的游戏中很多只有电脑上才能玩如LOL,手机端并不适合。二是我想很多游戏公司并不想接入微信小程序,为什么呢,利益的原因呗,游戏多么赚钱的行业我不说大家都知道,当年网易的丁磊可是凭借游戏一度成为中国的首富的,很多游戏商就会有顾虑,接入小程序也许现在微信不像你收费,但是一旦很多游戏都接入就会形成竞争这个时候谁要想凸显出现,掏钱让你排在前面吧,和百度、360搜索引擎的竞价排名一样。阿里巴巴不就是刚开始不收卖家的钱吗,但一旦数量积聚起来,不是就有了什么黄金展位、直通车之类的,做平台的目前就没有不收费的,想收你的钱分分钟钟就能想个招。我们都知道微信小程序这个平台有点特殊,你想啊手机上每天新出的和灭亡的app有多少啊,而且每个app背后都有一大堆的代码,其工作量是非常大,而且代码之类的总是不断的进行优化,app也总是不断的进行升级换代,对接起来非常麻烦,游戏本身的代码就非常的复杂繁琐,而且出现bug的概率也比较高,工作量的原因可能也是 小程序没有接入游戏的因素之一。现在的微信小程序可以说并不完善,一直处于优化中而且接入的很多程序并不多,就算接入了app的很多功能并不完善,你可以随便搜几个程序看看,其功能与自身的app相差甚远就拿今日头条来说吧,在微信小程序上其可供选择的选项非常少,比如你想看财经类的都没有我记得就有4/5个可供选择的,而进入今日头条本身app可供选择的有好几十种,游戏其实最重要的还是用户体验,你说我想借助个什么道具结果都没有那我还玩什么游戏啊,所以我想这是微信小程序目前没有接入游戏的最大因素吧。我们都知道微信里面在发现栏目中本身就有游戏这一类,而且里面的游戏集合和很多经典并且腾讯主推的游戏完全能够满足玩手游的同志们,所以没必要在接入游戏造成同质化的竞争,一方面浪费资源另一方面增加工作量。这并不利于微信小程序的发展。以上就是 本人可以想到的原因,希望对你有帮助。
扫一扫分享到微信
感觉第一批的话,微信还是觉得应用更实际吧。使用率会更高,而且我觉得小程序附着在微信里面,其实做的还是相对比较简单的那些。并不是功能很全面,记得刚开始有小程序的时候,摩拜单车就在微信的第一批小...
感觉第一批的话,微信还是觉得应用更实际吧。使用率会更高,而且我觉得小程序附着在微信里面,其实做的还是相对比较简单的那些。并不是功能很全面,记得刚开始有小程序的时候,摩拜单车就在微信的第一批小程序里面。当然了,现在摩拜也和微信合作了,在微信“我”里的“钱包”里面,就有它“限时推广”占领了一席之地。但是在摩拜单车的小程序里面,钱包一开始就不是太好用。刚开始好像不能充值吧,我记得。后来可以充值了,但是押金只能往里面充,不能用小程序退押金。后来,我北京的出差结束了之后,就没再用摩拜单车的小程序了,也就没怎么注意了。我记得当时“美团”的小程序,也有些问题,刚开始“大众点评”是可以获取到之前购买订单的数据的。可是美团的小程序,获取之前订单的数据就不全,只能获取一少部分。刚开始的时候啊,这样就很不方便,买了东西时间久一点的,就看不到,从微信小程序里面。所有,我美团还是在用APP版,没有用小程序版的。第一批可能要是做游戏的话,我觉得游戏场面可能更复杂,附着在微信里面,难度系数更高。而且画面体验感,未必达的到APP的效果。因为主显示页面,还是在微信里面。而微信相对这个能力来说,可能要弱一点,没有单独开发游戏,可做的很大,内容可以做的很丰富。这就是我觉得第一批没有上小程序的游戏版的原因,大家也可以一起探讨。
扫一扫分享到微信
,一口一个碗的经济学
作为一个经济学学生,我就只能从经济学的角度,而不会从专业技术领域来分析这个问题了,小程序拿它作为微信的一个野心,我们可以看到在小程序出来之前在整个互联网媒体当中已经进行了爆炸,甚至有很多小同...
作为一个经济学学生,我就只能从经济学的角度,而不会从专业技术领域来分析这个问题了,小程序拿它作为微信的一个野心,我们可以看到在小程序出来之前在整个互联网媒体当中已经进行了爆炸,甚至有很多小同学阴谋论微信阴谋论,而小程序的正式推出之后却显得表现凡凡,并没有引起很大的改变和关注,这可能是和李小龙他本身对于小程序的定义与态度不同,我们知道一个企业在作出决策然后实施的时候,把握这个速度和力度是最为重要的,而腾讯里面的微信作为腾讯的顶梁柱,在这一点上更是不能走错,所谓一失足成千古错。所以,小程序的第一代开发出来的仅仅是一些比较普通的应用,而这样的应用正是人们生活当中很常见的手机app,他这一种是与人们的手机app出现的一定重复,但是这样我们可以慢慢的看到他的野心,例如,他推出了一些关于饿了吗?或者说美团的这样一些撤销程序。虽然人们会更多地在使用手机上的app,但不得不说的是有一部分的人的流量已经从最开始的手机app被引入到了微信,通过微信打开小程序再去完成这些程序所做的一些基础事情,在这样一个过程当中,有越来越多的人开始选择微信,成为了一个必不可少的东西。就像阿里巴巴做的淘宝,他做的是一个平台,而微信的野心也就是这个平台,把手机里所有可以用的应用都通过微信给打开,就像之前听到有人说过,如果你的手机只能留下一个app,那它是什么呢?那是微信。所以在初步走的战略当中只需要吸引一部分的客户进来而获得这些客户的信任,获得这一切初步客户的反馈,而不是大跃进式的,把所有东西都纳入小程序当中,像游戏或者一些其他的软件,如果全部通通拉进来的话会死的,繁杂不好管理,最为关键的是可能会给用户留下不好的口碑,这对之后的野心推广来说是极为不利的。
扫一扫分享到微信
,蛋蛋的骚
我觉得是在推广上面吧,现在手机游戏正是最鼎盛的时候,各大手机游戏厂商都消减了脑袋向里面冲,虽然有很多的游戏都是垃圾,而且坑钱、停止维护什么样的恶心的事情都能做的出来,但是其中也不乏好游戏,但...
我觉得是在推广上面吧,现在手机游戏正是最鼎盛的时候,各大手机游戏厂商都消减了脑袋向里面冲,虽然有很多的游戏都是垃圾,而且坑钱、停止维护什么样的恶心的事情都能做的出来,但是其中也不乏好游戏,但是想要其画质精美也是要一定的内存的啊。微信小程序现在火起来了吗?没有 ,首先最开始的时候就是出师不利,我也一直没弄懂最开始的时候为什么不把小程序按钮放在都能找到的地方,让我随便点点就能看得到,我为了去看一下小程序是个什么样子的我还特意的去百度了进入的方法才成功的进入小程序,虽然现在小程序很好找了,但是到了这个时候热度已经下去了,而且微信对于这方面的推广也没有那么的足,导致很多的人并不会想用这个东西。至于开发游戏那是更加不可能的事情了,QQ有个QQ空间小游戏,实际上和一些小游戏也差不多,总之就是要坑你的钱和耗费你的时间,但是玩家也不是傻子,好玩和不好玩还是能够分得清的。微信里面有很多的活动都是通过玩一些小游戏来实现的,那些游戏都只是最基础的那种给予网页开发的游戏,质量不敢恭维,跟有专属APP的游戏没得比。而且最主要的一点是如果其质量上去了那加载一定是很慢的吧,就算是现在的4G网络够快,流量也烧不起啊,光是流量这一点是刷下去了大多数的人,而且小程序的推广是在是太差了,让太多的人都不知道这个东西,开发游戏没人玩,赔本啊。
扫一扫分享到微信
为什么微信第一批小程序没有游戏?
,才能进行回答
一个问题只能回答一次,请&nbsp点击此处&nbsp查看你的答案
6人关注了此问题微信支付 一步一个坑的APP支付!a year agomch_id商户号 固定值,你申请账号时就给你了
nonce_str随机字符串 这个是自己写的要求不能长于32位,参见官方给的[标准][8]
sign签名 我们把这个签名叫做第一次签名,注意这个是个坑,得自己写了,官方只给了如何写的[标准][9]没有代码,这个就比较蛋疼了。好多人掉进这个坑里,写的签名函数不对,老是出错。但不用担心我在文章的最后会贴出代码里面有签名函数直接调用就可以了。(注意看我写的函数使用规则)
body商品描述 固定值 商品描述交易字段格式根据不同的应用场景按照以下格式:APP——需传入应用市场上的APP名字-实际商品名称,天天爱消除-游戏充值。
out_trade_no商户订单号 我们自己定义的订单号,32个字符内、可包含字母。
total_fee总金额 这个就是你要支付的钱数了,由前端返回。注意一下这里的货币单位是分!
spbill_create_ip终端IP 这个用户的IP地址,写个取IP地址的函数一调用就行
notify_url通知地址 这又是一个坑,好多人不理解是干嘛的,这是接收微信支付异步通知回调地址用的,通知url必须为直接可访问的url,不能携带参数! 也可以这样理解,这个是给微信支付的接口,微信来调用的接口,微信调这接口干嘛用呢?就是告诉你用户付款成功啦或者用户付款失败了,然后你就可以在这个接口里通过微信给你返回的信息来做逻辑处理了。
trade_type固定值
写 “APP” 因为咱写的是APP支付嘛,所以就填APP。
好了就是这些必选参数了,剩下就可以自己选择是否要用的参数了根据自己情况而定。参数选完了就要发送参数了呗,如何发呢?我们来调用wechatAppPay类中的unifiedOrder()函数。啊哈啥!!!!!!??????(⊙o⊙)?(⊙o⊙)?(⊙o⊙)?(⊙o⊙)?(⊙o⊙)?wechatAppPay类???unifiedOrder()函数???对就这这俩东西,不要惊讶,不要着急看最后有代码,有这个类,有代码的O(∩_∩)O哈哈~,你只需在你的项目中加载这个类就可以调用这个方法了!不要崇拜我( ╯▽╰)(因为这个类不是我写的我也忘了从哪找的了,我从百度搜的然后整理的做了些改动╮(╯▽╰)╭ -_-|||-_-|||-_-!好吧好吧好吧没做改动,只是加了点注释而已,感谢写这个类的大神谢谢O(∩_∩)O谢谢O(∩_∩)O谢谢)好了抽完疯了,开是干正事!我们先来new下wechatAppPay类$wxappid
= 'wx0';//应用ID 字符串
= '';//商户号 字符串
$notify_url
= '/xxxx.php/xxxx/xxxx';//接收微信支付异步通知回调地址 字符串
= '';//这个是在商户中心设置的那个值用来生成签名时保证安全的 字符串
$this-&wechatAppPay = new wechatAppPay($wxappid, $mch_id, $notify_url, $wxkey);
调用wechatAppPay类中的unifiedOrder()函数。unifiedOrder()需要的参数是个数组我们定义为$params
= array();
$params['body']
= 'APP-在线支付';
//必填项 商品描述
$params['out_trade_no']
time()."$member";
//必填项 自定义的订单号
$params['total_fee']
= ($money*100);
//必填项 订单金额 单位为分所以要*100
$params['trade_type']
//必填项 交易类型固定写
$params['根据自己情况定的值'] = "根据自己情况定的值" //非必填项 根据自己情况定的值 这个可有好多个可以参看开发文档中的参数
$result = $this-&wechatAppPay-&unifiedOrder( $params );
注:如果你加了$params['根据自己情况定的值'] wechatAppPay类里要做相应的改动,文章的最后有代码,你一看代码就明白了现在$result就是我们调用统一下单接口返回的数据了,这个$resutl通过unifiedOrder()函数的处理已经把xml格式变成数组了。$result 里有return_code,return_msg,appid,mch_id,nonce_str,sign,result_code,prepay_id,trade_type。这里面就用一个prepay_id(预支付交易会话ID),其他都不重要了步骤2完毕步骤3 把数据返回给商户APP应用(移动端)现在我们要把调用统一下单接口返回的数据$resutl里的几个值返回给移动端那几个值呢?这几个:appid应用ID 这个是固定的 可以自己写也可以从$resutl里拿 可以让移动端写死 就不用每次返回了
partnerid商户号 这个也是固定的 可以自己写也可以从$resutl里拿 可以让移动端写死 就不用每次返回了
prepayid预支付交易会话ID 这个很重要必须返回给移动端 是必须从$resutl里拿的
package扩展字段 可以自己写也可以从$resutl里拿 暂填写固定值"Sign=WXPay" 可以让移动端写死 就不用每次返回了
noncestr随机字符串 这个可以自己写也可以从$resutl里拿
timestamp时间戳 自己生成 标准北京时间,时区为东八区注意:部分系统取到的值为毫秒级,需要转换成秒(10位数字),这里有个坑,ISO端接收的时候好像得强行转化一下,因为返回的是字符串不是数字,还有什么几位的数字之类的,我也不太懂,反正就是写的时候提醒下iOS工程师就行。安卓不清楚。
sign 签名 又来一个坑,我们把这个签名叫做二次签名,但是这个签名不是从$resutl里拿的,而是自己写的,如何写呢,又有坑!因为参与签名的参数值是那几个不清楚,参数名写不对!不怕我有代码!贴给你看!需要参与签名的值有六个!
$sign_array
= array();
$sign_array['appid']
= $wx_result['appid'];
//注意 $sign_array['appid'] 里的参数名必须是appid
$sign_array['partnerid'] = $wx_result['mch_id'];
//注意 $sign_array['partnerid'] 里的参数名必须是partnerid
$sign_array['prepayid']
= $wx_result['prepay_id'];//注意 $sign_array['prepayid'] 里的参数名必须是prepayid
$sign_array['package']
= 'Sign=WXPay';
//注意 $sign_array['package'] 里的参数名必须是package
$sign_array['noncestr']
= $wx_result['nonce_str'];//注意 $sign_array['noncestr'] 里的参数名必须是noncestr
$sign_array['timestamp'] = time();
//注意 $sign_array['timestamp'] 里的参数名必须是timestamp
$sign_two = $this-&wechatAppPay-&MakeSign($sign_array);//调用wechatAppPay类里的MakeSign()函数生成sign
现在就可以把重新生成的sign($sign_two)以及其他参数返回给移动端了,一共返回七个值,有三个之可以让前端写死(appid,partnerid,package),其余四个必须由服务器返回给移动端。步骤3完毕步骤4由移动端完成步骤5 回调接口 还记得步骤2中我们设置的$notify_url吗,对现在就要对这个微信返回到这个接口的数据进行一系列的逻辑处理了官方是这样写的:支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/00/,单位:秒)
注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄漏导致出现“假通知”,造成资金损失。
首先来接收数据$data = $this-&wechatAppPay-&getNotifyData();//获取数据 用wechatAppPay类里的getNotifyData()方法,这里数据也被getNotifyData()由xml转化成了数组。
然后官方说要采用数据锁进行并发控制,这个我不懂所以没写(如果你懂你会的话请给我留言私信告诉我,在这谢谢了),对数据进行状态检查这个写了,如何写的呢?很简单微信返回的值有好多其中就可以判断result_code(业务结果)和return_code(返回状态码)是否为SUCCESS就可以了代码就不写了。然后验签,这个很重要因为这是保证数据没有被第三方人为篡改的标准!如何验签呢?把返回的数据$data里除去sign剩下的值都参与重新签名我们把这次签名叫做验签签名,验签签名生成后再与$data里的sign对比,如果相同验签通过,否则不通过。这次签名的参数名与二次签名时的参数名不同,$data数组里叫什么参数名就验签时叫什么参数名。听乱了吧?(~ ̄▽ ̄)~(~ ̄▽ ̄)~没关系请看代码
//假如$data里有如下参数
$w_sign = array();
//参加验签签名的参数数组
$w_sign['appid']
= $data['appid'];
$w_sign['bank_type']
= $data['bank_type'];
$w_sign['cash_fee']
= $data['cash_fee'];
$w_sign['fee_type']
= $data['fee_type'];
$w_sign['is_subscribe']
= $data['is_subscribe'];
$w_sign['mch_id']
= $data['mch_id'];
$w_sign['nonce_str']
= $data['nonce_str'];
$w_sign['openid']
= $data['openid'];
$w_sign['out_trade_no']
= $data['out_trade_no'];
$w_sign['result_code']
= $data['result_code'];
$w_sign['return_code']
= $data['return_code'];
$w_sign['time_end']
= $data['time_end'];
$w_sign['total_fee']
= $data['total_fee'];
$w_sign['trade_type']
= $data['trade_type'];
$w_sign['transaction_id']
= $data['transaction_id'];
$verify_sign = $this-&wechatAppPay-&MakeSign($w_sign);//生成验签签名
好了现在假设你的验签已经通过了接下里就是你自己的逻辑处理了///////////////////////////////////////////////////////
商户APP应用(后台)处理逻辑代码
//////////////////////////////////////////////////////
自己的逻辑处理已经处理完之后,还得告诉微信一下,别再一直发结果通用通知啦,我已经收到通知并处理完啦! $this-&wechatAppPay-&replyNotify();//商户处理后同步返回给微信参数
步骤5结束步骤6根据自己情况而定结束语至此微信支付处理完成~(≧▽≦)/~啦啦啦~(≧▽≦)/~啦啦啦~(≧▽≦)/~啦啦啦~(≧▽≦)/~啦啦啦写的有不对的方还请大家多多指导指教!!!给我留言!!b( ̄▽ ̄)db( ̄▽ ̄)db( ̄▽ ̄)d还有感谢在我写微信支付地时候 那些被我问烦了的大神们! !谢谢啦~(≧▽≦)/~啦啦啦~(≧▽≦)/~啦啦啦~(≧▽≦)/~啦啦啦O(∩_∩)O哈哈~O(∩_∩)O哈哈~O(∩_∩)O哈哈~&( ̄︶ ̄)&&( ̄︶ ̄)&&( ̄︶ ̄)&代码wechatAppPay类我的class wechatAppPay
//接口API URL前缀
const API_URL_PREFIX = 'https://api.mch.';
//下单地址URL
const UNIFIEDORDER_URL = "/pay/unifiedorder";
//查询订单URL
const ORDERQUERY_URL = "/pay/orderquery";
//关闭订单URL
const CLOSEORDER_URL = "/pay/closeorder";
//公众账号ID
private $mch_
//随机字符串
private $nonce_
//商品描述
//商户订单号
private $out_trade_
//支付总金额
private $total_
private $spbill_create_
//支付结果回调通知地址
private $notify_
//交易类型
private $trade_
//支付密钥
//证书路径
private $SSLCERT_PATH;
private $SSLKEY_PATH;
//所有参数
private $params = array();
public function __construct($wxappid, $mch_id, $notify_url, $key)
$this-&appid = $
$this-&mch_id = $mch_
$this-&notify_url = $notify_
$this-&key = $
* 下单方法
$params 下单参数
public function unifiedOrder( $params ){
$this-&body = $params['body'];
$this-&out_trade_no = $params['out_trade_no'];
$this-&total_fee = $params['total_fee'];
$this-&trade_type = $params['trade_type'];
$this-&nonce_str = $this-&genRandomString();
$this-&spbill_create_ip = $_SERVER['REMOTE_ADDR'];
$this-&params['appid'] = $this-&
$this-&params['mch_id'] = $this-&mch_
$this-&params['nonce_str'] = $this-&nonce_
$this-&params['body'] = $this-&
$this-&params['out_trade_no'] = $this-&out_trade_
$this-&params['total_fee'] = $this-&total_
$this-&params['spbill_create_ip'] = $this-&spbill_create_
$this-&params['notify_url'] = $this-&notify_
$this-&params['trade_type'] = $this-&trade_
//获取签名数据
$this-&sign = $this-&MakeSign( $this-&params );
$this-&params['sign'] = $this-&
$xml = $this-&data_to_xml($this-&params);
$response = $this-&postXmlCurl($xml, self::API_URL_PREFIX.self::UNIFIEDORDER_URL);
if( !$response ){
$result = $this-&xml_to_data( $response );
if( !empty($result['result_code']) && !empty($result['err_code']) ){
$result['err_msg'] = $this-&error_code( $result['err_code'] );
* 查询订单信息
* @param $out_trade_no
* @return array
public function orderQuery( $out_trade_no ){
$this-&params['appid'] = $this-&
$this-&params['mch_id'] = $this-&mch_
$this-&params['nonce_str'] = $this-&genRandomString();
$this-&params['out_trade_no'] = $out_trade_
//获取签名数据
$this-&sign = $this-&MakeSign( $this-&params );
$this-&params['sign'] = $this-&
$xml = $this-&data_to_xml($this-&params);
$response = $this-&postXmlCurl($xml, self::API_URL_PREFIX.self::ORDERQUERY_URL);
if( !$response ){
$result = $this-&xml_to_data( $response );
if( !empty($result['result_code']) && !empty($result['err_code']) ){
$result['err_msg'] = $this-&error_code( $result['err_code'] );
* 关闭订单
* @param $out_trade_no
* @return array
public function closeOrder( $out_trade_no ){
$this-&params['appid'] = $this-&
$this-&params['mch_id'] = $this-&mch_
$this-&params['nonce_str'] = $this-&genRandomString();
$this-&params['out_trade_no'] = $out_trade_
//获取签名数据
$this-&sign = $this-&MakeSign( $this-&params );
$this-&params['sign'] = $this-&
$xml = $this-&data_to_xml($this-&params);
$response = $this-&postXmlCurl($xml, self::API_URL_PREFIX.self::CLOSEORDER_URL);
if( !$response ){
$result = $this-&xml_to_data( $response );
* 获取支付结果通知数据
* return array
public function getNotifyData(){
//获取通知的数据
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$data = array();
if( empty($xml) ){
$data = $this-&xml_to_data( $xml );
if( !empty($data['return_code']) ){
if( $data['return_code'] == 'FAIL' ){
* 接收通知成功后应答输出XML数据
* @param string $xml
public function replyNotify(){
$data['return_code'] = 'SUCCESS';
$data['return_msg'] = 'OK';
$xml = $this-&data_to_xml( $data );
* 生成APP端支付参数
public function getAppPayParams( $prepayid ){
$data['appid'] = $this-&
$data['partnerid'] = $this-&mch_
$data['prepayid'] = $
$data['package'] = 'Sign=WXPay';
$data['noncestr'] = $this-&genRandomString();
$data['timestamp'] = time();
$data['sign'] = $this-&MakeSign( $data );
* 生成签名
@return 签名
public function MakeSign( $params ){
//签名步骤一:按字典序排序数组参数
ksort($params);
$string = $this-&ToUrlParams($params);
//签名步骤二:在string后加入KEY
$string = $string . "&key=".$this-&
//签名步骤三:MD5加密
$string = md5($string);
//签名步骤四:所有字符转为大写
$result = strtoupper($string);
* 将参数拼接为url: key=value&key=value
public function ToUrlParams( $params ){
$string = '';
if( !empty($params) ){
$array = array();
foreach( $params as $key =& $value ){
$array[] = $key.'='.$
$string = implode("&",$array);
* 输出xml字符
返回组装的xml
public function data_to_xml( $params ){
if(!is_array($params)|| count($params) &= 0)
$xml = "&xml&";
foreach ($params as $key=&$val)
if (is_numeric($val)){
$xml.="&".$key."&".$val."&/".$key."&";
$xml.="&".$key."&&![CDATA[".$val."]]&&/".$key."&";
$xml.="&/xml&";
* 将xml转为array
* @param string $xml
* return array
public function xml_to_data($xml){
if(!$xml){
//将XML转为array
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
* 获取毫秒级别的时间戳
private static function getMillisecond(){
//获取毫秒的时间戳
$time = explode ( " ", microtime () );
$time = $time[1] . ($time[0] * 1000);
$time2 = explode( ".", $time );
$time = $time2[0];
* 产生一个指定长度的随机字符串,并返回给用户
* @param type $len 产生字符串的长度
* @return string 随机字符串
private function genRandomString($len = 32) {
$chars = array(
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
"w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
"3", "4", "5", "6", "7", "8", "9"
$charsLen = count($chars) - 1;
// 将数组打乱
shuffle($chars);
$output = "";
for ($i = 0; $i & $ $i++) {
$output .= $chars[mt_rand(0, $charsLen)];
* 以post方式提交xml到对应的接口url
* @param string $xml
需要post的xml数据
* @param string $url
* @param bool $useCert 是否需要证书,默认不需要
* @param int $second
url执行超时时间,默认30s
* @throws WxPayException
private function postXmlCurl($xml, $url, $useCert = false, $second = 30){
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);
//设置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
if($useCert == true){
//设置证书
//使用证书:cert 与 key 分别属于两个.pem文件
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
//curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH);
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
//curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH);
//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//运行curl
$data = curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
$error = curl_errno($ch);
curl_close($ch);
* 错误代码
服务器输出的错误代码
* return string
public function error_code( $code ){
$errList = array(
'商户未开通此接口权限',
'NOTENOUGH'
'用户帐号余额不足',
'ORDERNOTEXIST'
'订单号不存在',
'ORDERPAID'
'商户订单已支付,无需重复操作',
'ORDERCLOSED'
'当前订单已关闭,无法支付',
'SYSTEMERROR'
'系统错误!系统超时',
'APPID_NOT_EXIST'
'参数中缺少APPID',
'MCHID_NOT_EXIST'
'参数中缺少MCHID',
'APPID_MCHID_NOT_MATCH' =&
'appid和mch_id不匹配',
'LACK_PARAMS'
'缺少必要的请求参数',
'OUT_TRADE_NO_USED'
'同一笔交易不能多次提交',
'SIGNERROR'
'参数签名结果不正确',
'XML_FORMAT_ERROR'
'XML格式错误',
'REQUIRE_POST_METHOD'
'未使用post传递参数 ',
'POST_DATA_EMPTY'
'post数据不能为空',
'NOT_UTF8'
'未使用指定编码格式',
if( array_key_exists( $code , $errList ) ){
return $errList[$code];
0收藏分享举报{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&contributes&:[],&title&:&微信支付 一步一个坑的APP支付!&,&author&:&en-jiu-shi-zhe-ge-ming&,&content&:&\u003Ch2\u003E引言\u003C\u002Fh2\u003E\u003Cp\u003E秋高气爽,天气转凉,正是学习工作做的好时候。(~ ̄▽ ̄)~~(~ ̄▽ ̄)~\u003C\u002Fp\u003E\u003Cp\u003E我是个phper最近在写微信支付(APP支付),微信给的官方文档并不是很详细也没有dome之类的代码啥的(对于新手来说比较麻烦),本人是新手以前也没写过支付,踩了好多坑,所以想写篇文章给没写过支付的新手几个建议。\u003C\u002Fp\u003E\u003Ch2\u003E准备工作\u003C\u002Fh2\u003E\u003Cp\u003E这首先呢你得注册个\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fopen.\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E开放平台\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E以及\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fpay.\u002Findex.php\u002Fcore\u002Fhome\u002Flogin%3Freturn_url%3D\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E商户平台\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E的账号吧,注册完成后呢你会收到一封微信里邮件里面有你的商户号等信息,注册这俩账号完你会拥有商户号,appid,appkey等需要的东西。\u003C\u002Fp\u003E\u003Ch2\u003E开发流程\u003C\u002Fh2\u003E\u003Cp\u003E准备完成后我们来看一下支付的大体流程\u003C\u002Fp\u003E\u003Cp\u003E商户APP应用与微信支付主要的交互说明:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E\u003Cp\u003E用户在商户APP应用(移动端)中选择商品提交订单,支付方式选择微信支付。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E商户APP应用(后台)收到用户支付订单,调用微信支付中的\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fpay.\u002Fwiki\u002Fdoc\u002Fapi\u002Fapp\u002Fapp.php%3Fchapter%3D9_1\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E统一下单接口\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E商户APP应用(后台)统一下单接口调用成功后,返回的数据中有我们需要的prepay_id,按照\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fpay.\u002Fwiki\u002Fdoc\u002Fapi\u002Fapp\u002Fapp.php%3Fchapter%3D4_3\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E签名规范\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E重新生成一个签名,然后把这个重新生成的签名及app需要的数据返回给商户APP应用(移动端)。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E商户APP应用(移动端)收到商户APP应用(后台)的数据调起微信支付,用户进行支付\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E商户APP应用(后台)的回调接口会收到微信发来的\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fpay.\u002Fwiki\u002Fdoc\u002Fapi\u002Fapp\u002Fapp.php%3Fchapter%3D9_7%26index%3D3\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E支付结果通知\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E商户APP应用(后台)查询\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fpay.\u002Fwiki\u002Fdoc\u002Fapi\u002Fapp\u002Fapp.php%3Fchapter%3D9_2%26index%3D4\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E支付结果通知\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cbr\u003E\u003Cp\u003E附:1,4是移动端所要做的事情,2,3,5是我们PHP服务端后台要做的6也是,但我没做,这个根据情况而定如果需要的话就做。\u003C\u002Fp\u003E\u003Ch2\u003E开始干活\u003C\u002Fh2\u003E\u003Cp\u003E步骤1由移动端完成\u003Cbr\u003E步骤2. \u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fpay.\u002Fwiki\u002Fdoc\u002Fapi\u002Fapp\u002Fapp.php%3Fchapter%3D9_1\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E调用同一下单接口\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E:\u003C\u002Fp\u003E\u003Cp\u003E先要做的是流程中的第二步,调用同一下单接口。官方文档里说了请求的地址与参数,其中有一些是必填参数,有\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cp\u003Eappid\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E应用ID 固定值,你申请账号时就给你了\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Emch_id\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E商户号 固定值,你申请账号时就给你了\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Enonce_str\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E随机字符串 这个是自己写的要求不能长于32位,参见官方给的[标准][8]\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Esign\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E签名 我们把这个签名叫做第一次签名,注意这个是个坑,得自己写了,官方只给了如何写的[标准][9]没有代码,这个就比较蛋疼了。好多人掉进这个坑里,写的签名函数不对,老是出错。但不用担心我在文章的最后会贴出代码里面有签名函数直接调用就可以了。(注意看我写的函数使用规则)\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Ebody\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E商品描述 固定值 商品描述交易字段格式根据不同的应用场景按照以下格式:APP——需传入应用市场上的APP名字-实际商品名称,天天爱消除-游戏充值。\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Eout_trade_no\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E商户订单号 我们自己定义的订单号,32个字符内、可包含字母。\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Etotal_fee\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E总金额 这个就是你要支付的钱数了,由前端返回。注意一下这里的货币单位是分!\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Espbill_create_ip\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E终端IP 这个用户的IP地址,写个取IP地址的函数一调用就行\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Enotify_url\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E通知地址 这又是一个坑,好多人不理解是干嘛的,这是接收微信支付异步通知回调地址用的,通知url必须为直接可访问的url,不能携带参数! 也可以这样理解,这个是给微信支付的接口,微信来调用的接口,微信调这接口干嘛用呢?就是告诉你用户付款成功啦或者用户付款失败了,然后你就可以在这个接口里通过微信给你返回的信息来做逻辑处理了。\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Etrade_type\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E固定值
写 “APP” 因为咱写的是APP支付嘛,所以就填APP。 \n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cbr\u003E\u003Cp\u003E好了就是这些必选参数了,剩下就可以自己选择是否要用的参数了根据自己情况而定。\u003C\u002Fp\u003E\u003Cp\u003E参数选完了就要发送参数了呗,如何发呢?\u003Cbr\u003E我们来调用wechatAppPay类中的unifiedOrder()函数。\u003Cbr\u003E啊哈啥!!!!!!??????\u003Cbr\u003E(⊙o⊙)?(⊙o⊙)?(⊙o⊙)?(⊙o⊙)?(⊙o⊙)?\u003Cbr\u003EwechatAppPay类???unifiedOrder()函数???\u003Cbr\u003E对就这这俩东西,不要惊讶,不要着急看最后有代码,有这个类,有代码的O(∩_∩)O哈哈~,\u003Cbr\u003E你只需在你的项目中加载这个类就可以调用这个方法了!不要崇拜我( ╯▽╰)(因为这个类不是我写的我也忘了从哪找的了,我从百度搜的然后整理的做了些改动╮(╯▽╰)╭ -_-|||-_-|||-_-!好吧好吧好吧没做改动,只是加了点注释而已,感谢写这个类的大神谢谢O(∩_∩)O谢谢O(∩_∩)O谢谢)\u003Cbr\u003E好了抽完疯了,开是干正事!\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E我们先来new下wechatAppPay类\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-php\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&x\&\u003E$wxappid
= 'wx0';\u002F\u002F应用ID 字符串\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E$mch_id
= '';\u002F\u002F商户号 字符串\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E$notify_url
= 'http:\u002F\\u002Fxxxx.php\u002Fxxxx\u002Fxxxx';\u002F\u002F接收微信支付异步通知回调地址 字符串\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E$wxkey
= '';\u002F\u002F这个是在商户中心设置的那个值用来生成签名时保证安全的 字符串\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&x\&\u003E$this-&wechatAppPay = new wechatAppPay($wxappid, $mch_id, $notify_url, $wxkey);\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E调用wechatAppPay类中的unifiedOrder()函数。unifiedOrder()需要的参数是个数组我们定义为$params\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-php\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&x\&\u003E
= array();\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$params['body']
= 'APP-在线支付';
\u002F\u002F必填项 商品描述\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$params['out_trade_no']
time().\&$member\&;
\u002F\u002F必填项 自定义的订单号\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$params['total_fee']
= ($money*100);
\u002F\u002F必填项 订单金额 单位为分所以要*100\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$params['trade_type']
= 'APP';
\u002F\u002F必填项 交易类型固定写
\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$params['根据自己情况定的值'] = \&根据自己情况定的值\& \u002F\u002F非必填项 根据自己情况定的值 这个可有好多个可以参看开发文档中的参数\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$result = $this-&wechatAppPay-&unifiedOrder( $params );\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E注:如果你加了$params['根据自己情况定的值'] wechatAppPay类里要做相应的改动,文章的最后有代码,你一看代码就明白了\u003Cbr\u003E现在$result就是我们调用统一下单接口返回的数据了,这个$resutl通过unifiedOrder()函数的处理已经把xml格式变成数组了。$result 里有return_code,return_msg,appid,mch_id,nonce_str,sign,result_code,prepay_id,trade_type。这里面就用一个prepay_id(预支付交易会话ID),其他都不重要了\u003Cbr\u003E步骤2完毕\u003C\u002Fp\u003E\u003Cp\u003E步骤3 把数据返回给商户APP应用(移动端)\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fpay.\u002Fwiki\u002Fdoc\u002Fapi\u002Fapp\u002Fapp.php%3Fchapter%3D9_12%26index%3D2\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E调起支付接口\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E现在我们要把调用统一下单接口返回的数据$resutl里的几个值返回给移动端\u003Cbr\u003E那几个值呢?这几个:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cp\u003Eappid\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E应用ID 这个是固定的 可以自己写也可以从$resutl里拿 可以让移动端写死 就不用每次返回了\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Epartnerid\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E商户号 这个也是固定的 可以自己写也可以从$resutl里拿 可以让移动端写死 就不用每次返回了\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Eprepayid\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E预支付交易会话ID 这个很重要必须返回给移动端 是必须从$resutl里拿的\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Epackage\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E扩展字段 可以自己写也可以从$resutl里拿 暂填写固定值\&Sign=WXPay\& 可以让移动端写死 就不用每次返回了\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Enoncestr\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E随机字符串 这个可以自己写也可以从$resutl里拿\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Etimestamp\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E时间戳 自己生成 标准北京时间,时区为东八区注意:部分系统取到的值为毫秒级,需要转换成秒(10位数字),这里有个坑,ISO端接收的时候好像得强行转化一下,因为返回的是字符串不是数字,还有什么几位的数字之类的,我也不太懂,反正就是写的时候提醒下iOS工程师就行。安卓不清楚。\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Esign\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-php\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&x\&\u003E 签名 又来一个坑,我们把这个签名叫做二次签名,但是这个签名不是从$resutl里拿的,而是自己写的,如何写呢,又有坑!因为参与签名的参数值是那几个不清楚,参数名写不对!不怕我有代码!贴给你看!需要参与签名的值有六个!\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$sign_array
= array();\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$sign_array['appid']
= $wx_result['appid'];
\u002F\u002F注意 $sign_array['appid'] 里的参数名必须是appid\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$sign_array['partnerid'] = $wx_result['mch_id'];
\u002F\u002F注意 $sign_array['partnerid'] 里的参数名必须是partnerid\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$sign_array['prepayid']
= $wx_result['prepay_id'];\u002F\u002F注意 $sign_array['prepayid'] 里的参数名必须是prepayid\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$sign_array['package']
= 'Sign=WXPay';
\u002F\u002F注意 $sign_array['package'] 里的参数名必须是package\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$sign_array['noncestr']
= $wx_result['nonce_str'];\u002F\u002F注意 $sign_array['noncestr'] 里的参数名必须是noncestr\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$sign_array['timestamp'] = time();
\u002F\u002F注意 $sign_array['timestamp'] 里的参数名必须是timestamp\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$sign_two = $this-&wechatAppPay-&MakeSign($sign_array);\u002F\u002F调用wechatAppPay类里的MakeSign()函数生成sign\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E现在就可以把重新生成的sign($sign_two)以及其他参数返回给移动端了,一共返回七个值,有三个之可以让前端写死(appid,partnerid,package),其余四个必须由服务器返回给移动端。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cbr\u003E\u003Cp\u003E步骤3完毕\u003C\u002Fp\u003E\u003Cp\u003E步骤4由移动端完成\u003Cbr\u003E步骤5 回调接口 \u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fpay.\u002Fwiki\u002Fdoc\u002Fapi\u002Fapp\u002Fapp.php%3Fchapter%3D9_7%26index%3D3\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E支付结果通用通知\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E还记得步骤2中我们设置的$notify_url吗,对现在就要对这个微信返回到这个接口的数据进行一系列的逻辑处理了\u003Cbr\u003E官方是这样写的:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。\n对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15\u002F15\u002F30\u002F180\u002F00\u002F00\u002F3600,单位:秒)\n注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。\n推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。\n特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄漏导致出现“假通知”,造成资金损失。\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E首先来接收数据\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E$data = $this-&wechatAppPay-&getNotifyData();\u002F\u002F获取数据 用wechatAppPay类里的getNotifyData()方法,这里数据也被getNotifyData()由xml转化成了数组。\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E然后官方说要采用数据锁进行并发控制,这个我不懂所以没写(如果你懂你会的话请给我留言私信告诉我,在这谢谢了),对数据进行状态检查这个写了,如何写的呢?很简单微信返回的值有好多其中就可以判断result_code(业务结果)和return_code(返回状态码)是否为SUCCESS就可以了代码就不写了。\u003Cbr\u003E然后验签,这个很重要因为这是保证数据没有被第三方人为篡改的标准!\u003Cbr\u003E如何验签呢?\u003Cbr\u003E把返回的数据$data里除去sign剩下的值都参与重新签名我们把这次签名叫做验签签名,验签签名生成后再与$data里的sign对比,如果相同验签通过,否则不通过。这次签名的参数名与二次签名时的参数名不同,$data数组里叫什么参数名就验签时叫什么参数名。听乱了吧?(~ ̄▽ ̄)~(~ ̄▽ ̄)~没关系请看代码\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-php\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&x\&\u003E
\u002F\u002F假如$data里有如下参数\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign = array();
\u002F\u002F参加验签签名的参数数组
\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['appid']
= $data['appid'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['bank_type']
= $data['bank_type'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['cash_fee']
= $data['cash_fee'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['fee_type']
= $data['fee_type'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['is_subscribe']
= $data['is_subscribe'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['mch_id']
= $data['mch_id'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['nonce_str']
= $data['nonce_str'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['openid']
= $data['openid'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['out_trade_no']
= $data['out_trade_no'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['result_code']
= $data['result_code'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['return_code']
= $data['return_code'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['time_end']
= $data['time_end'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['total_fee']
= $data['total_fee'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['trade_type']
= $data['trade_type'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$w_sign['transaction_id']
= $data['transaction_id'];\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&x\&\u003E
$verify_sign = $this-&wechatAppPay-&MakeSign($w_sign);\u002F\u002F生成验签签名\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E好了现在假设你的验签已经通过了接下里就是你自己的逻辑处理了\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-php\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&x\&\u003E\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E 商户APP应用(后台)处理逻辑代码\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E自己的逻辑处理已经处理完之后,还得告诉微信一下,别再一直发结果通用通知啦,我已经收到通知并处理完啦!\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-php\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&x\&\u003E $this-&wechatAppPay-&replyNotify();\u002F\u002F商户处理后同步返回给微信参数\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E \u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cbr\u003E\u003Cp\u003E步骤5结束\u003Cbr\u003E步骤6根据自己情况而定\u003C\u002Fp\u003E\u003Ch2\u003E结束语\u003C\u002Fh2\u003E\u003Cp\u003E至此微信支付处理完成~(≧▽≦)\u002F~啦啦啦~(≧▽≦)\u002F~啦啦啦~(≧▽≦)\u002F~啦啦啦~(≧▽≦)\u002F~啦啦啦\u003C\u002Fp\u003E\u003Cp\u003E写的有不对的方还请大家多多指导指教!!!给我留言!!b( ̄▽ ̄)db( ̄▽ ̄)db( ̄▽ ̄)d\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E还有感谢在我写微信支付地时候 那些被我问烦了的大神们! !谢谢啦~(≧▽≦)\u002F~啦啦啦~(≧▽≦)\u002F~啦啦啦~(≧▽≦)\u002F~啦啦啦O(∩_∩)O哈哈~O(∩_∩)O哈哈~O(∩_∩)O哈哈~&( ̄︶ ̄)&&( ̄︶ ̄)&&( ̄︶ ̄)&\u003C\u002Fp\u003E\u003Ch2\u003E代码\u003C\u002Fh2\u003E\u003Cp\u003EwechatAppPay类\u003C\u002Fp\u003E\u003Cbr\u003E我的\u003Ca href=\&http:\u002F\\u002F?target=https%3A\\u002Fa\u002F6519\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E原文地址\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-php\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&x\&\u003Eclass wechatAppPay \u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E{
\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F接口API URL前缀\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
const API_URL_PREFIX = 'https:\u002F\u002Fapi.mch.';\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F下单地址URL\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
const UNIFIEDORDER_URL = \&\u002Fpay\u002Funifiedorder\&;\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F查询订单URL\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
const ORDERQUERY_URL = \&\u002Fpay\u002Forderquery\&;\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F关闭订单URL\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
const CLOSEORDER_URL = \&\u002Fpay\u002Fcloseorder\&;\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F公众账号ID\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F商户号\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $mch_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F随机字符串\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $nonce_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F签名\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F商品描述\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F商户订单号\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $out_trade_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F支付总金额\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $total_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F终端IP\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $spbill_create_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F支付结果回调通知地址\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $notify_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F交易类型\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $trade_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F支付密钥\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F证书路径\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $SSLCERT_PATH;\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $SSLKEY_PATH;\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F所有参数\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
private $params = array();\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
public function __construct($wxappid, $mch_id, $notify_url, $key)\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
{\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&appid = $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&mch_id = $mch_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&notify_url = $notify_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&key = $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F**\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* 下单方法\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$params 下单参数\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
*\u002F\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
public function unifiedOrder( $params ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&body = $params['body'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&out_trade_no = $params['out_trade_no'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&total_fee = $params['total_fee'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&trade_type = $params['trade_type'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&nonce_str = $this-&genRandomString();\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&spbill_create_ip = $_SERVER['REMOTE_ADDR'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['appid'] = $this-&\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['mch_id'] = $this-&mch_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['nonce_str'] = $this-&nonce_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['body'] = $this-&\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['out_trade_no'] = $this-&out_trade_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['total_fee'] = $this-&total_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['spbill_create_ip'] = $this-&spbill_create_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['notify_url'] = $this-&notify_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['trade_type'] = $this-&trade_\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&x\&\u003E
\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F获取签名数据\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&sign = $this-&MakeSign( $this-&params );\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['sign'] = $this-&\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$xml = $this-&data_to_xml($this-&params);\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$response = $this-&postXmlCurl($xml, self::API_URL_PREFIX.self::UNIFIEDORDER_URL);\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
if( !$response ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$result = $this-&xml_to_data( $response );\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
if( !empty($result['result_code']) && !empty($result['err_code']) ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$result['err_msg'] = $this-&error_code( $result['err_code'] );\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
return $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F**\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* 查询订单信息\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* @param $out_trade_no
订单号\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* @return array\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
*\u002F\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
public function orderQuery( $out_trade_no ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['appid'] = $this-&\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['mch_id'] = $this-&mch_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['nonce_str'] = $this-&genRandomString();\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['out_trade_no'] = $out_trade_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F获取签名数据\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&sign = $this-&MakeSign( $this-&params );\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['sign'] = $this-&\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$xml = $this-&data_to_xml($this-&params);\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$response = $this-&postXmlCurl($xml, self::API_URL_PREFIX.self::ORDERQUERY_URL);\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
if( !$response ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$result = $this-&xml_to_data( $response );\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
if( !empty($result['result_code']) && !empty($result['err_code']) ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$result['err_msg'] = $this-&error_code( $result['err_code'] );\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
return $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F**\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* 关闭订单\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* @param $out_trade_no
订单号\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* @return array\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
*\u002F\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
public function closeOrder( $out_trade_no ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['appid'] = $this-&\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['mch_id'] = $this-&mch_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['nonce_str'] = $this-&genRandomString();\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['out_trade_no'] = $out_trade_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F获取签名数据\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&sign = $this-&MakeSign( $this-&params );\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$this-&params['sign'] = $this-&\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$xml = $this-&data_to_xml($this-&params);\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$response = $this-&postXmlCurl($xml, self::API_URL_PREFIX.self::CLOSEORDER_URL);\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
if( !$response ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$result = $this-&xml_to_data( $response );\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
return $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F**\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* \u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* 获取支付结果通知数据\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* return array\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
*\u002F\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
public function getNotifyData(){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F获取通知的数据\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$data = array();\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
if( empty($xml) ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$data = $this-&xml_to_data( $xml );\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
if( !empty($data['return_code']) ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
if( $data['return_code'] == 'FAIL' ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
return $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F**\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* 接收通知成功后应答输出XML数据\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* @param string $xml\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
*\u002F\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
public function replyNotify(){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$data['return_code'] = 'SUCCESS';\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$data['return_msg'] = 'OK';\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$xml = $this-&data_to_xml( $data );\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
echo $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
die();\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F**\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* 生成APP端支付参数\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
预支付id\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
*\u002F\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
public function getAppPayParams( $prepayid ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$data['appid'] = $this-&\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$data['partnerid'] = $this-&mch_\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$data['prepayid'] = $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$data['package'] = 'Sign=WXPay';\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$data['noncestr'] = $this-&genRandomString();\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$data['timestamp'] = time();\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$data['sign'] = $this-&MakeSign( $data ); \u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
return $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F**\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* 生成签名\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
@return 签名\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
*\u002F\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
public function MakeSign( $params ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F签名步骤一:按字典序排序数组参数\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
ksort($params);\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$string = $this-&ToUrlParams($params);\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F签名步骤二:在string后加入KEY\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$string = $string . \&&key=\&.$this-&\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F签名步骤三:MD5加密\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$string = md5($string);\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
\u002F\u002F签名步骤四:所有字符转为大写\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$result = strtoupper($string);\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
return $\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
}\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&x\&\u003E
\u002F**\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
* 将参数拼接为url: key=value&key=value\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$params\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
string\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
*\u002F\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
public function ToUrlParams( $params ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
$string = '';\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E
if( !empty($params) ){\u003C\u002Fspan\u003E\n\u003Cspan class=\&x\&\u003E

我要回帖

更多关于 微信如何与付款方联系 的文章

 

随机推荐