关于微信支付你需要知道的一切
PS:可耻的借用了郭霖大神的口头禅(关于。。。你所需要知道的一切)^_^
在做商城项目的时候需要集成支付宝和微信支付,由于支付宝先审核通过,所以就先集成的支付宝,前后花了差不多2个小时,自我感觉还是能接受,毕竟没有集成过。这里吐槽一下,我在支付宝开发平台和微信开放平台下午同时去申请开通(而且微信需要的资料巨多),结果就是在第二天早上支付宝就提示我通过了,但是微信却等了2天,等2天的结果就是反馈我提交的资料不对,但我前前后后检查一遍,没有错误,随后再次提交一遍,继续等2天,竟然通过了。。。我只能安慰自己说微信审核的人员来大姨妈了。
废话不多说了,先来个效果图,由于只有几个页面,就懒得做gif了
我们不管是使用支付宝或者是微信支付,都必须要在相应的开放平台上注册应用得到APPID,并开通支付功能得到秘钥等。微信开放平台地址:https://open.weixin.qq.com/
我登录我的账号,进入我的应用可以看到我的支付功能已经开通了
如果你没有开通支付功能的话就不能进行支付,需要开通支付,按照官网提示的步骤一步一步的来,差什么资料就找项目经理要,等审核通过后微信平台会给你发送一封邮件,邮件内容有你的商户号、商户登录账号、商户登录密码,这个商户号是用在代码里面的,登录账号是用在微信商户管理平台上的,不要弄反了。
打开微信商户管理界面(https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F),输入平台账号和密码(这里会要你安装财付通的插件),按照提示安装后重启即可
进入管理平台后,点击账户中心,在左侧下方点击api安全,按照电脑的操作证书和设置秘钥
设置秘钥的时候要注意一下,随便输入的32位秘钥是掉不起来支付界面的,所以需要用MD5加密一下,MD5工具:http://tool.chinaz.com/tools/md5.aspx?qq-pf-to=pcqq.c2c。最好不要随便输入,我是在网上找的密码生成器:http://suijimimashengcheng.51240.com/选择密码长度为32位,然后把得到的密码再去用MD5工具生成md5值,把转换后的md5值设置在商户平台上去,并本地保存一份,因为在支付的时候需要用到。
得到这些必要条件后再去在项目中集成,如果你想看官方代码可以去在商户平台下载,不是在开放平台,开发平台代码是没有支付代码的
这个官方demo是有坑的,我下载后就调不通,
我就不帖报错日志了,第一个报错就是这个url是访问不了的,用电脑打开也不行,然后第二个报错就是第二个红框的地方,这里由于url访问不了,所以就不能用get方法了,需要用post方法得到统一支付id,但是官方代码工具类中只有post方法,而且需要一大推参数,所以我就没在这个代码基础上弄了,哎、没办法,打开studio,new项目。
创建项目的时候注意一下报名要和开放平台上注册的应用报名一样,对不上的话是调不起来的,这个就是我的demo结构
这个Demo里面我做了分享、登录、和支付的功能,为了检测签名是否正确,我先调用了分享接口,如果分享能成功,就可以排除签名的问题,具体的代码可以下载下来看,也很简单,替换掉报名、APPID、商户号、商户秘钥就好了
现在主要看支付的,调用微信支付必须要得到预支付交易会话标识prepay_id,而prepay_id需要通过接口post请求得到,一般这个预支付id是后台做的事情,我们在实际过程中只需要传入商品id到后台,然后服务器做请求并返回数据到app端,app端得到支付所需要的参数发起请求,调出微信支付界面。但是在调试微信支付的时候是没有后台配合你的,所以我们只能自己通过这个接口去得到prepayId啦。
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1这个是这个接口具体需要的参数和返回的参数,我们根据这个文档来填写参数。
注意:如果自己随便填写一个prepay_ID和sign是调用不起来支付界面的,而且没有任何提示。
官方demo里面的post的请求需要一个url和字符串,这个字符串按照文档来看是需要一个xml的格式,所以我们就需要对参数进行拼接,如下图:
得到参数后就调用post的请求,这个地方要注意不要在主线程中调用工具内的post的方法,不然会崩溃,所以我们就使用了AsyncTask,用Handler也可以。
我们在doInBackground中去进行post请求,然后在onPostExecute中去调用支付,如图:
注意一下,不管是分享还是登陆、支付都需要注册微信的,一般在AppLication全局注册就可以了
最后说一下这个回调监听,这个监听是不需要布局的,不过你想要设置布局的话也是可以的。清单文件中如图,和官方demo一样,不过intent-filter不需要也能调用支付,还要注意不要忘了加网络请求权限,网络权限没有加上而去做支付请求的时候是没有任何提示的
大概也说的差不多了,具体的话可以下载demo来看看,demo我是在项目中提取出来的,所以界面比较简单,没那个花里胡哨。总体而言支付功能是比较简单的,不过我也是弄了半天才弄好,哎。。。心塞
demo地址:http://download.csdn.net/detail/zouanfu/9785437