微信支付实战详解
最近的旅游度假项目,需要用到微信支付,因为我们是在微信公众号里面,通过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) 编辑 收藏 举报