chaojidan

导航

微信支付实战详解

最近的旅游度假项目,需要用到微信支付,因为我们是在微信公众号里面,通过H5页面进行微信支付,因此用到的微信支付是:公众号微信支付,也称作jsAPI微信支付。

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

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

前端:js,后端:java。

第一步:获取客户微信号的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。

其中,scope的值如果设置为snsapi_base ,那么不会弹出授权页面,直接跳转,不过只能获取用户的openid,微信支付只需要这个openid,因此可以等于snsapi_base。

state随便可以等于多少。

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

如果这个回跳地址带有参数,那么需要使用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编码,最后,弄成大写。

如果,大家对微信公众号支付有问题的,可以留言,我可以帮助大家。

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

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

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

 

 

 

 

加油!

posted on 2015-06-10 16:21  chaojidan  阅读(1759)  评论(1编辑  收藏  举报