【2015年11月6日 星期五】
1、开发过程中遇到的一些问题:
〇
现在微信支付已经是V3,但是网上有些Demo还是V2的,升级之后,一些参数已经发生改变,具体看微信支付FAQ,要注意。
http://kf.qq.com/faq/140225MveaUz150413VNj6nm.html
〇
微信APP支付,是通过打开微信,来支付,并不提供网页版支付界面。
所以使用微信支付,需要用户手机安装有微信。
〇
几个主要参数:
APP_ID,微信开放平台提交的APP,会有一个APPID;
MCH_ID,申请成功之后,微信给你的邮件中有商户号ID;
API_KEY,这个是微信商户平台上的API秘钥;
〇
关于Demo的使用。
1)
https://github.com/joefei/WeiXinPay(运行APP需要自己APP的签名、APP_ID、API_KEY、MCH_ID,所以只是做了一些注释,并不能运行)
流程:
需要先获得预支付订单的ID;
然后生成支付签名;
最后才能调起支付,进入微信的支付界面。
2)
还有,demo这里的APP_ID的参数是null,如下(可以去API文档查参数的说明):
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
请将官方提供的上面这段代码改为如下代码:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(this,"wxd930ea5d5a258f4f", false);
另外,WXPayEntryActity、AppRegister中的该参数也都为null,APP_ID都已经用常量了,为什么还要留null呢?
3)
在做支付回调步骤的时候,接口回调的WXEntryActivity必须是:
你的包名(在开放平台提交的APP的设置的包名)+.wxapi.WXEntryActivity.java
4)Demo,预支付步骤中,在生成sign的时候,少了商户号的参数。所以调试之前,先把API文档看清楚,那些参数是必填的;
〇
在获取预支付ID的时候,返回了“签名错误”,原因是我的参数没有按ASCII编码排序;
由于微信支付提供的demo少了商户号的key,我就自己加上了,但文档没看仔细,结果没有按照ASCII编码顺序排序。
导致生成的sign和在线校验工具生成的不一致。
将参数名重新排序后,生成的sign就正确了。
----------------------------
关于微信支付的签名部分的文档:
1、签名算法
https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=4_3
2、微信支付接口调试工具(线签名验证工具)
https://pay.weixin.qq.com/wiki/tools/signverify/
3、APP微信支付返回“签名错误”的问题
网上提供了几种问题原因:
1)参数名ASCII码未按升序排列。
2)或者是生成MD5字符串没有toUpperCase转换为大写。
这种问题解决方法很简单,到微信官网上用校验工具校验即可。
3)key错误。
这里特别注意,公众平台的密钥和商户号的密钥是不一样的!!!
微信支付审核成功之后会收到一封邮件,邮件中有appid 商户号,商户后台登录上号和密码。
登录到商户后台:账户设置-安全设置-切换到API安全,下载证书,下面有一个api密匙,进去填写一个字符串 ,保存,后续两次签名都是用的这个手动设置的key!!!
4)还有就是中文编码问题;
微信native方式支付中body为中文时签名错误解决方法
http://blog.csdn.net/qiwenmingshiwo/article/details/41902551
----------------------------
微信支付相关文档整理.
官方文档(将文档看仔细是很重要的,比如签名的算法、必填的参数、注意事项等)
〇
【微信开放平台】(用于管理APP,ID和签名,微信支付属于微信开放平台的一部分)
mch_id=微信支付商户号
【Android接入指南】
1、申请AppID(开发者登记、应用审核);
2、下载SDK(libammsdk.jar、API、界面小工具源码);
3、IDE配置;
1)
AndroidManifest:网络访问权限、磁盘读写权限、手机读取权限;
2)注册到微信:
public static final String APP_ID = "wx1234123412341234";//申请到的官方AppID;
private IWXAPI api;//APP与微信通信的OpenAPI接口;
private void regToWx(){
api=WXAPIFactory.createWXAPI(this,APP_ID,true);//实例化
api.registerApp(APP_ID);//注册到微信
}
3)通信
IWXAPI的
boolean sendReq(BaseReq req)
;//请求
boolean sendResp(BaseResp resp);//响应
【安卓资源下载】(开发工具包SDK、范例、签名工具)
〇
【接入微信支付的步骤】(非开发步骤,需公司完成接入):
首先去开放平台注册账号,
然后公司的资质认证,
然后提交需要微信功能的APP,获得对应的AppID;
最后提交申请资料,才能开通此APP的微信支付功能;
〇
【微信支付开发文档】:
微信支付之APP支付(场景介绍、案例及规范、业务流程、API文档、APP端开发步骤)
1、后台申请APPID
2、应用包名,AndroidManifest.xml中的package值;
3、应用签名;
2、
SDK下载(微信支付APP支付示例、Android头文件和库下载)
Android头文件和库文件下载地址:
〇
微信支付开发常见问题:
-----------------------------
〇参考文档:
〇
方倍工作室(微信公众平台开发)
〇
Android微信支付高速集成案例及有效解决返回值-1
注意:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
请将官方提供的上面这段代码改为如下代码:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(this,"wxd930ea5d5a258f4f", false);
//API说明,
static IWXAPI createWXAPI(Context context, String appId, boolean checkSignature)
〇
android应用集成微信支付
〇
坑爹的微信支付v3,其实没有那么坑
〇
到处都是坑的微信支付V3
〇
Android微信支付V3版
// 最关键的一步,我们要把最终发送的数据字符转为字节后,再使用“ISO8859-1”进行编码,得到“ISO8859-1”的字符串,否则有可能有“签名错误”的问题
byte[] buf = Util.httpPost(url, new String(toXml(nvps).getBytes(),"ISO8859-1"));
〇
微信native方式支付中body为中文时签名错误解决方法
〇
微信开放平台有个 不成文的规定(文档里没有说明),就是回调的Activity必须是:你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXPayEntryActivity.java
其他的接口回调的Activity必须是:你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXEntryActivity.java
〇
Android微信支付
http://fangjie.info/android微信支付
〇
微信支付 for android 集成笔记( 集成遇到问题记录)
安全性设计,
把一些重要的东西放到服务器生生成,这样是为防止客户端被反编译。
反编译之后,带来的就是别人拿到key 模拟支付过程,把某个订单号支付完成。
那么,腾讯那边收到钱就会同时给客户端 和我们自己的服务器发送请求。
那么,我们自己的服务器收到腾讯的通知之后,就会把这个订单的状态置为已经支付。
就是因为订单信息在我们的服务器上,腾讯不知道订单的价格,他只管收钱就行了。
也就是支付的时候100元的订单,修改价格为1元之后,也可以支付成功。