美文网首页
微信支付 - 「App集成」

微信支付 - 「App集成」

作者: blackanger | 来源:发表于2014-04-25 14:56 被阅读0次

微信支付分为两个场景:公众帐号内支付、App移动客户端集成微信支付。
本文描述的是App移动客户端集成,记录一下文档坑爹的地方。


申请微信支付:

首先,你得去微信开放平台申请微信支付。经过比较漫长的申请过程,审核通过之后,可以去这里下载文档和demo。

开发

使用方式描述: 当使用App点击微信支付,会直接跳转到微信进行支付。

开发步骤:

  • 获取access token
  • 获取prepayid
  • 得到sign,结合prepayid发起微信支付请求
  • 支付完成

上面的所有步骤,你可以在iOS或者Andriod端完成,但是,为了安全最好在服务端完成前两步。

而我就是在服务端完成了前两步,使用Ruby。

支付逻辑

  • 使用access token 访问支付接口。
  • 预支付订单的生成包含双重验证: a:package为订单数据打包,携带一个md5签名,sign, b:app_signature则为访问接口使用签名验证,sha1。
  • 得到预支付id,生成客户端发起微信支付请求需要的sign,这个c: client_pay_sign是sha1签名。因为你在服务端完成签名,所以移动客户端不需要知道package的具体值了,因为已经从服务端创建预支付订单的时候传过去了,所以这里只需要固定值“Sign=WXPay”
  • 最终,需要把预支付id和签名c(上面那个client_pay_sign)传给客户端,客户端就可以发起微信支付请求了。
  • 整个过程客户端完全不知道appkey,secret,partnerid等敏感数据。

下面是值的注意的地方:

获取access token

POST url = https://api.weixin.qq.com/cgi-
bin/token?grant_type=client_credential

# post params
appid=APPID
secret=APPSECRET

微信支付的文档里写的是用GET,我就不吐槽腾讯的文档了,你用GET能取到的只有错误码。所以这个地方是用POST,才能取到access token。
当然这里你用到的APPID和APPSECRET是你申请成功微信支付后才会有的。

获取prepayid

第一眼看微信支付的文档,感觉是和支付宝快捷支付一样,但是看到这一步的时候,感觉微信支付做的更安全。生成预支付订单完全可以在服务端完成。

POST  https://api.weixin.qq.com/pay/genprepay?access_token=ACCESS_TOKEN

很多人会碰到一个错误:{"errcode":40001,"errmsg":"invalid credential"}
这个时候需要仔细检查你的access token是不是给对了。

然后就是POST Data,一定要是json对象, 要仔细看文档,写对参数名,否则会碰到{"errcode":49004,"errmsg":"not match signature"}的错误。

生成package
这个地方文档描述的不是很正确,不知道是不是写文档的人语文没学好,我来把文档重新纠正一下。

  • A)对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格 式(即 key1=value1&key2=value2...)拼接成字符串 string1;
  • B) 在 string1 最后拼接上 key=partnerKey 得到 stringSignTemp 字符串, 并对 stringSignTemp 进行 md5 运算,再将得到的字符串所有字符转换为大写,得到 sign 值 signValue。
  • C)对 string1 中的所有键值对中的 value 进行 urlencode 转码,按照 a 步骤重新拼接成字符 串,得到 string2。对于 js 前端程序,一定要使用函数 encodeURIComponent 进行 urlencode 编码(注意!进行 urlencode 时要将空格转化为%20 而不是+)。
  • D)将 sign=signValue 拼接到 string2 后面得到最终的 package 字符串。

字典序,在Ruby里,用sort方法就可以了。
文档里的D)写的是把sign=signValue拼接到string1后面,应该是拼到string2后面,也就是经过url encode的字串。

我被坑到的地方就是,POST Data转成json对象的时候,使用了to_json方法, 把package参数里的&符号转成了\u0026。
应该使用JSON.generate(data)来转换。

把上面所说的搞对,基本就很顺了。

生成app_signature

这里需要注意的是,appkey就是paySignKey, 128位长的字符串, 请不要和app secret、appid搞混。


总结

剩下的根据文档就很简单了。和支付宝一样,会有异步通知到notify_url, 到时候处理好你的业务逻辑就可以了。记得返回success。

相关文章

  • 微信App支付接入&支付流程

    微信App支付接入&支付流程 最近对微信App支付(App端集成微信支付SDK)申请步骤,以及终端在进行微信支付时...

  • 微信支付 - 「App集成」

    微信支付分为两个场景:公众帐号内支付、App移动客户端集成微信支付。本文描述的是App移动客户端集成,记录一下文档...

  • iOS 微信支付详解

    最近公司需要开发支付功能,经过这两天的工作成功集成了app微信支付、支付宝支付。本文主要讲述微信支付的流程和在集成...

  • 支付

    微信支付集成 前段时间,公司突然要在App中集成支付功能。毫无意外的选择了支付宝、微信 支付宝,这里就不多说了。按...

  • 微信APP支付-3 SDK的使用

    集成完SDK后使用微信支付App支付的SDK,需要在代码设计。 一、注册 要使用微信支付首先要注册我们的App,在...

  • Android支付宝支付详解

    微信支付参考:android微信支付详解与坑官方文档:App支付Android集成流程 好久之前写过支付一直没做个...

  • iOS集成支付宝-Swift版

    iOS集成支付宝-Swift版 如果要了解整个支付流程可以阅读文章《手机App集成微信支付&支付宝-iOS&And...

  • Android集成支付----微信支付总结与封装

    前言 之前做过一次微信支付的集成,但是没有总结。最近一个App又要集成微信支付,又要重新下载demo,重新看开发文...

  • iOS微信支付集成(二)

    这一篇主要介绍APP微信支付的集成,不管怎么着都要首先参考APP微信支付的开发文档。基本过程如下:下载"微信SDK...

  • 微信APP支付-2 集成SDK

    官方文档 一、集成SDK 手动集成或者使用pod集成微信App支付的SDK,SDK文件包括 libWeChatSD...

网友评论

      本文标题:微信支付 - 「App集成」

      本文链接:https://www.haomeiwen.com/subject/evfrtttx.html