微信支付企业付款可以设置h5调用微信分享接口接口的服务器IP地址吗

微信支付开发中的“坑”与解决之道
发表于 17:43|
来源《程序员》电子刊|
作者刘运强
摘要:微信支付是腾讯公司的支付业务品牌,它提供公众号支付、扫码支付等支付方式,并且还提供代金券、现金红包等营销工具。微信支付结合微信公众号,是移动支付的首选。现在来介绍一下微信支付开发中的各种“坑”。
微信支付是腾讯公司的支付业务品牌,它提供公众号支付、扫码支付、APP支付、刷卡支付等支付方式,并且还提供代金券、现金红包、企业付款等营销工具。微信支付结合微信公众号,全面打通O2O生活消费领域,提供专业的互联网+行业解决方案,是移动支付的首选。日,微信5.0版本引入了微信支付功能。日,腾讯发布了“2015微信用户数据报告”,报告称微信支付用户数达到4亿左右,可见微信支付的发展速度非常惊人。我有幸于2013年6月微信支付内测期间就开始接触微信支付开发,亲眼见证了微信支付的每一次成长。在此期间,有许多初学者向我咨询微信支付开发。今天,我就来吐槽一下微信支付开发中的各种“坑”。V2和V3差异大微信支付接口现在分为V2版和V3版,日之前申请的为V2版,之后申请的为V3版。这两个版本在功能和接口上都有很大差别,不能互用,开发时要特别注意这一点,否则可能会走很多弯路。开发文档混乱微信公众平台开发者文档位于http://mp./wiki/,相信大家都比较熟悉,然而有意思的是,这里面唯独没有微信支付的接口文档。微信支付的接口文档要登录微信公众平台才能看得到,如图1所示。图1 微信支付接口文档噢,原来藏在这里,也不算难找嘛!然而,仔细观察会发现这里没有代金券、现金红包、企业付款等接口的说明。如果要查看所有的微信支付接口文档,需要去微信支付商户平台,访问地址为https://pay./wiki/doc/api/index.html,如图2所示。图2 微信支付商户平台开发者文档签名算法为了保证数据安全,微信支付要求所有发送或接收的数据都必须经过签名,相信不少开发者都在签名算法上吃过亏。下面是生成签名时的一些注意事项和经验分享。【参数按字典序排序】需要特别注意的是,参数名严格区分大小写,并且值为空的参数不参与签名。最让我记忆犹新的是开发“收货地址共享接口”,调用接口需要传递的参数(appId、timeStamp和nonceStr)在签名时都必须小写。至于参数按字典序排序,在Java中,可以采用SortedMap来实现,非常简便,不建议开发者自己实现排序算法。【MD5和SHA1算法】在微信支付相关的接口中,“收货地址共享接口”使用SHA1算法进行签名,除此之外的其他接口都使用MD5算法进行签名。对于大多数开发者而言,编写SHA1和MD5算法是有一定难度的,虽然最终的实现代码只有几行。在Java中,可以采用Apache Commons Codec工具包来实现标准的MD5和SHA-1,示例代码如下:String source = "签名测试";
String md5 = DigestUtils.md5Hex(source);
System.out.println("md5签名结果:" + md5);
String sha1 = DigestUtils.sha1Hex(source);
System.out.println("sha1签名结果:" + sha1);说明:运行以上示例需要在工程中引入jar包commons-codec-1.9.jar。另外,需要注意的是,在“收货地址共享接口”中,官方给出的SHA1签名示例的结果是错误的,这估计误导了很多开多者,让他们误以为自己的签名算法有误。官方示例如下经我测试,上述示例中SHA1签名后的正确结果为:双向证书首先,我们来简单认识一下SSL证书、单向认证和双向认证。SSL证书是由受信任的数字证书颁发机构CA(如GlobalSign,WoSign),在验证服务器身份后颁发的,具有服务器身份验证和数据传输加密的功能。单向认证是指在SSL通信过程中,客户端需要验证服务器证书的合法性,而服务器端不对客户端证书进行校验。双向认证是指在SSL通信过程中,客户端需要验证服务器证书的合法性,服务器端也需要验证客户端证书的合法性。在微信支付开发中,申请退款、发放现金红包、发放裂变红包等接口需要用到商户证书,微信服务器会验证商户证书的合法性。API证书文件可按以下路径下载:下载到API证书之后,该如何在程序中使用呢?这就需要使用KeyManagerFactory类和KeyStore类,在程序中设定客户端使用的证书。核心代码如下:// 证书文件(微信商户平台-账户设置-API安全-API证书-下载证书)
String keyStorePath = "D:/apiclient_cert.p12";
// 证书密码(默认为商户ID)
String password = WxPayUtil.
// 实例化密钥库
KeyStore ks = KeyStore.getInstance("PKCS12");
// 获得密钥库文件流
FileInputStream fis = new FileInputStream(keyStorePath);
// 加载密钥库
ks.load(fis, password.toCharArray());
// 关闭密钥库文件流
fis.close();
// 实例化密钥库
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
// 初始化密钥工厂
kmf.init(ks, password.toCharArray());
// 创建SSLContext
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());
// 获取SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod(requestMethod);
// 设置当前实例使用的SSLSocketFactory
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();希望本篇文章能够帮助开发者顺利避开微信支付开发的各种“坑”,快速掌握微信支付接口的使用。作者简介刘运强,网名“柳峰”,Java软件开发工程师、Android/iOS移动应用开发工程师,国内微信公众平台应用开发的先驱之一,常年活跃在CSDN社区,并在CSDN博客撰写了系列微信公众平台二次开发的教程,深受欢迎并被广泛传播,也因此获得了CSDN2013年度博客之星。著有《微信公众平台应用开发:方法、技巧与案例》一书。本文选自程序员电子版2015年11月B刊,该期更多文章请查看。2000年创刊至今所有文章目录请查看。欢迎(含iPad版、Android版、PDF版)。&
推荐阅读相关主题:
为了更好帮助企业深入了解国内外最新大数据技术,掌握更多行业大数据实践经验,进一步推进大数据技术创新、行业应用和人才培养,-12日,由中国计算机学会(CCF)主办,CCF大数据专家委员会承办,中国科学院计算技术研究所、北京中科天玑科技有限公司及CSDN共同协办的2015中国大数据技术大会(Big Data Technology Conference 2015,BDTC 2015)将在北京新云南皇冠假日酒店隆重举办。
相关热门文章微信企业付款api的使用
编辑:阅读()
关键字词:微信企业付款
无相关信息
Design by DanceSmile&问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
看了微信的demo和文档,它们的demo里的调用支付方法都没有商品的名称 描述 价格这些信息,我们公司android那边说不需要先调下单api,他们都直接调用支付宝支付,不知道该怎么实现
+ (NSString *)jumpToBizPay {
//============================================================
// V3&V4支付流程实现
// 注意:参数配置请查看服务器端Demo
// 更新时间:日
//============================================================
NSString *urlString
= @"http://wxpay./pub_v2/app/app_pay.php?plat=ios";
//解析服务端返回json数据
//加载一个NSURL对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
//将请求的url数据放到NSData对象中
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
if ( response != nil) {
NSMutableDictionary *dict = NULL;
//IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中
dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
NSLog(@"url:%@",urlString);
if(dict != nil){
NSMutableString *retcode = [dict objectForKey:@"retcode"];
if (retcode.intValue == 0){
NSMutableString *stamp
= [dict objectForKey:@"timestamp"];
//调起微信支付
PayReq* req
= [[[PayReq alloc] init]autorelease];
req.partnerId
= [dict objectForKey:@"partnerid"];
req.prepayId
= [dict objectForKey:@"prepayid"];
req.nonceStr
= [dict objectForKey:@"noncestr"];
req.timeStamp
= stamp.intV
req.package
= [dict objectForKey:@"package"];
= [dict objectForKey:@"sign"];
[WXApi sendReq:req];
//日志输出
NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[dict objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
return @"";
return [dict objectForKey:@"retmsg"];
return @"服务器返回错误,未获取到json对象";
return @"服务器返回错误";
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
查看微信支付的时序图(文档中),客户端发送交易信息给服务器,服务器组反回加签后的报文,然后客户端再去调用微信支付。支付宝最好也改用相同的逻辑,私钥信息放在服务器端加签,每次先请求服务器加签报文,再调用支付接口。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
当然需要,我们现在上线的微信支付就是通过服务端统一下单返回数据给Android,IOS然后调起微信进行支付
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App}

我要回帖

更多关于 调用微信扫一扫接口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信