微信企业号支付PHP实现分析

最近公司业务需要,需要做微信支付。由于以前没有接触过,以至于我是公司里第一个吃螃蟹的人,哈哈!看官方文档,查看资料,坑确实不少,一言难尽!粗略了整理下,以供参考!求高手指点!
<strong>一.企业资质</strong>:
主体类型 企业
CorpID:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx //appId
key:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //appKey 
MCHID:1342614284001//商户号
Secret:0hvzovFqCK2kHk4hd1Nvc5t5yK8d7kcBtFQ2lTPSNtLl1C2g8HE93jweO2vDn_1jWYr //APPSecret
帐号上限 1400
二。服务器支持
1.编码问题:第三方utf-8,如果你的环境是gbk,那么下单的时候刚需参数可能要转码,一直报参数错误
2.支持https 查看下PHP open_ssl系统默认的curl是不支持https的。php 使用curl的访问https的网站,会提示502错误。解决办法如下:重新编译php
三.相关配置
1.应用中心修改可信域名(找到企业小助手)xxxx.m.tests.xxxx.com授权支付目录(服务中心->微信服务->开发配置):xxxx.m.tests.xxxx.com/wx/pay/
2.设置授权目录:
比如你的url:xxxx.m.tests.xxxx.com/pay/https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx075660a67ec833e6&redirect_uri=http://xxxx.m.tests.xxxx.com/pay/pay.php&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
四.企业号微信支付时候,需要获取支付用户openid,公众号需要用secret,企业号不需要,会提示无效的secret,企业号通过access_token和code获取,2种况
1.获取code(只能用一次,5分钟有效)
https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 详见:http://qydev.weixin.qq.com/wiki/index.php?title=OAuth%E9%AA%8C%E8%AF%81%E6%8E%A5%E5%8F%A3
2.同一个API:https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=yourToken&code=yourCode企业内部成员得到的是userid,需要将userid转换成openid api接口:https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid?access_token=yourToken&userid=内部成员的userid
*注意:userid必须以json串的方式传递
3.企业非内部成员得到的是openid*注意:access_token通过api获取,corpid是企业的appId,secret是设置中管理组的secret,每创建一个管理组都会有一个secret(猜想,获取tooken,可能不限secret,以企业的appid为准,secret只是个密钥)如下:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=企业号设置中的 帐号信息 CorpID&corpsecret=企业号中设置任意管理组的secret 有效时间:7200s

五.统一下订单返回信息,下面我是放到了一个打数组里,打印结果
Array(
[orderPayInfo] => Array(
[appid] => xxxxxxxxxxxxxx
[mch_id] => xxxxxxxxxxxxx
[nonce_str] => xxxxxxxxxxx
[prepay_id] => wx20160704160654377095cb1da115105812
[result_code] => SUCCESS
[return_code] => SUCCESS
[return_msg] => OK[sign] => A95074D7DFC43FFCF221211222882B29D0D5FE458[trade_type] => JSAPI)[jsApiParam] => {"appId":"xxxxxxxxxxxxxxx","nonceStr":"xxxxxxxxxxxx","package":"prepay_id=wx20160703416065477095cb1da1151058129","signType":"MD5","timeStamp":"1434467619614","paySign":"A95074D7DFC4FFCF221211222882B29D0D5FE4583"}
[address] => {"addrSign":"21fc736cdc207513af7e32f35b796a280f3cb9eee","signType":"sha1","scope":"jsapi_address","appId":"xxxxxxxxxxxxxxx","timeStamp":"146764419614","nonceStr":"123444568"})
*注意:本地环境是否是utf-8,订单号至少2位,才可以支付,该死的官方说32位以内 一直报参数错误
六.支付成功返回的正确xml格式
<xml><appid><![CDATA[xxxxxxxxxxxxxxx]]></appid> 企业cornId,即aped
<bank_type><![CDATA[CMB_CREDIT]]></bank_type> 银行类型
<cash_fee><![CDATA[1]]></cash_fee> 现金
<fee_type><![CDATA[CNY]]></fee_type> 支付方式:微信,招商,各种银行卡
<is_subscribe><![CDATA[Y]]></is_subscribe> 是否订阅
<mch_id><![CDATA[1346484001]]></mch_id> 商户号
<nonce_str><![CDATA[z7ohncia3gg3bgsmwfp3a8z69b1qhhoar]]></nonce_str> 随机字符串
<openid><![CDATA[okeEqrmrv2jAddL1EtIBNPlCya6PlovSc]]></openid> 微信用户的唯一标识
<out_trade_no><![CDATA[134648400120160705153507]]></out_trade_no> 订单号
<result_code><![CDATA[SUCCESS]]></result_code> 支付成功标识
<return_code><![CDATA[SUCCESS]]></return_code> 通信标识
<sign><![CDATA[B3050E2F6DBBdA2A22DC7ww34130C9B3CB971B6]]></sign> 签名
<time_end><![CDATA[20160705153517]]></time_end> 支付时间
<total_fee>1</total_fee> 总金额
<trade_type><![CDATA[JSAPI]]></trade_type> 支付类型 NATIVE jsApi app
<transaction_id><![CDATA[401056082001201607022584643661]]></transaction_id> 交易号
</xml>
*注意:这里需要排重支付的状态,因为微信在没收到你正确的应答之前,是有重发机制的,解决办法如下:
	根据交易号,查询支付记录,如果有的话,不插入。得根据其返回来的resultCode 判断支付是否成功,如果不成工更改为失败状态,如果成功的话改成支付成功八.微信支付过程分两部分
1.用户支付行为:支付完成、取消支付、支付失败
2.回掉:在用户支付完成,微信会通知支付结果:result_code(SUCCESS/FAIL)​​用户支付完成不代表用户真正支付成功,不靠谱的,以回掉通知为准 !

求高手指点


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值