微信支付实战详解

最近的旅游度假项目,须要用到微信支付,由于咱们是在微信公众号里面,经过H5页面进行微信支付,所以用到的微信支付是:公众号微信支付,也称做jsAPI微信支付。html

至于,微信支付的接口,请看个人另一篇博客http://www.cnblogs.com/chaojidan/p/4503878.html。前端

微信支付要作的三步:第一步:获取客户的微信号对应的惟一openID。第二步:经过此openID,调用统一下单接口,获取prepay_id。第三步,经过prepay_id,调用微信支付接口,进行微信支付。java

前端:js,后端:java。ajax

第一步:获取客户微信号的openID。算法

首先,观看此网页:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html后端

里面有一项是经过此连接:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect得到code。api

其中,scope的值若是设置为snsapi_base ,那么不会弹出受权页面,直接跳转,不过只能获取用户的openid,微信支付只须要这个openid,所以能够等于snsapi_base。跨域

state随即可以等于多少。微信

最重要的是redirect_uri,也就是用户受权后,页面跳转到的URL,也就是咱们项目的支付页面。app

若是这个回跳地址带有参数,那么须要使用encodeURIComponent进行编码。

当页面跳转到回跳地址后,会带上这些参数,而且还会加上code参数。获取code后,请求如下连接获取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

返回值中带有openid:

{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE", "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }
可是,因为ajax请求会跨域,所以,可使用js请求后台接口,也就是java代码,咱们把code传给后台,让后台去请求https://api.weixin.qq.com/sns/oauth2/access_token这个接口,而后得到openid。

第二步:

调用统一下单接口,这个接口,必定要看清楚一些参数,好比:

openid,文档上写的是否是必填,可是你看下后面的文字:

trade_type=JSAPI,此参数必传,用户在商户appid下的惟一标识。下单前须要调用【网页受权获取用户信息】接口获取到用户的Openid。

也就是说,你的支付接口是JSAPI时,这个openid必传,所以,须要先得到openid。

还有一个是时间戳,金额的格式,最后一个是签名了,签名要看微信提供的签名文档,须要注意的不少,请你们看清楚,最后那个API秘钥ID,是在商户平台上面设置的,不是appSecret。

第三步:

js调用微信支付接口,java,后台,提供前端js这些参数:

       "appId" : "wx2421b1c4370ec43b",     //公众号名称,由商户传入     
           "timeStamp":" 1395712654",         //时间戳,自1970年以来的秒数     
           "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串     
           "package" : "prepay_id=u802345jgfjsdfgsdg888",     
           "signType" : "MD5",         //微信签名方式:     
           "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 

这个参数形式必定要跟后台人员进行沟通,确认,至于签名对不对,微信有专门的签名系统进行确认,地址是:http://mch.weixin.qq.com/wiki/tools/signverify/

 

通常,作好这些以后,你的编码就完成了,可是你点击支付的时候,可能会报错,提示:invalid appid。

这个问题是由于支付受权目录的问题,

进入微信公众号号->微信支付-》开发配置里面

有一个支付配置,一个支付测试。

能够先在支付测试里面配置,里面须要添加白名单,也就是你微信号的帐号,否则进行请求时,会弹出access refuse的错误。

这个测试受权目录,只能添加二级目录或者三级目录,可是必须注意的一点是:你的支付页面,必须在这个二级目录或者三级目录,也就是说,你设置的二级目录或者三级目录下面,必须有支付页面。这个切记。

最后,若是报签名错误,那就是后台java代码写的签名算法出错了,签名算法,也注意先排序,而后最后添加api秘钥,而后md5编码,最后,弄成大写。

若是,你们对微信公众号支付有问题的,能够留言,我能够帮助你们。

说实话,微信支付这块的文档很乱,这点微信团队须要整理下。

还有一点,网上有不少人写了不少出错的缘由,有些是没用的,我不知道会害多少人,哎,支付目录的问题,不少人没有弄明白,请切记:

这个测试受权目录,只能添加二级目录或者三级目录,可是必须注意的一点是:你的支付页面,必须在这个二级目录或者三级目录,也就是说,你设置的二级目录或者三级目录下面,必须有支付页面。这个切记。

 

 

 

 

加油!

相关文章
相关标签/搜索