企业在app上集成支付宝收费标准2017

集成支付宝钱包支付iOS SDK的方法与经验 - 简书
集成支付宝钱包支付iOS SDK的方法与经验
没想到,支付宝的SDK是我目前用过的所有第三方SDK中最难用的一个了。
首先,你要想找到这个SDK,都得费点功夫。现在的SDK改名叫移动支付集成开发包了,下载页面在
Baidu和Googlep排在前面的支付宝开放平台,里面的SDK已经是2年前的版本了,而且还不支持64位架构。
压缩包里有两个相关文档 :《支付宝钱包支付接口开发包2.0标准版.pdf》《支付宝钱包支付接口开发包2.0标准版接入与使用规则.pdf》iOS相关内容可以主要看第一个文档,第二个文档名字和里面写的不一样,内容其实是个附录;文档里面多个平台都涉及到了,内容有些杂乱。下面先解释下整体SDK的流程和要做的事,就好对症下药找文档内相应的内容了。
摘自第一个文档《支付宝钱包支付接口开发包2.0标准版.pdf》
业务流程图
图中的“商户客户端”就是我们的iOS客户端需要做的事情:
调用支付宝支付接口
处理支付宝返回的支付结果
在调用支付宝支付接口前,我们还需要先生成一个订单,文档中描述时,是将这步也放在客户端来做了,但也可以在服务器端生成这个订单(图中支付宝会在支付成功后通知服务器端,所以在服务器端生成订单的话,你可以掌握所有订单,而且也会更安全):
生成订单(可以在iOS客户端内生成,也可以在服务器端生成)
调用支付宝支付接口,发送订单
处理支付宝返回的支付结果
其实对于业务来说,这些步骤已经够了,但是有一个安全性问题,你肯定不希望你接收到的支付结果被截获修改,所以,这就需要在生成订单和处理支付结果的时候做一个安全性校验:生成订单时对数据签名,收到支付结果时对数据进行签名验证,以检验数据是否被篡改过。支付宝目前只支持采用RSA加密方式做签名验证。
除了可加解密外,还可用来作签名校验。简单的说,RSA会生成一个私钥和一个公钥,私钥你应该独自保管,公钥你可以分发出去。做签名验证时,你可以用私钥对需要传输的数据做签名加密,生成一个签名值,之后分发数据,接收方通过公钥对签名值做校验,如果一致则认为数据无篡改。
具体到支付宝使用RSA做签名验证,就是在生产订单时,需要使用私钥生成签名值;在处理返回的支付结果时,需要使用公钥验证返回结果是否被篡改了。具体需要对哪些值,怎样生成签名,对哪些值最签名验证,可以在第一个文档中找找,后面我会简单提一下,但还是以文档或实践为准吧。
清楚了流程后,就好理解怎么集成了。
如果只需要发送订单和处理支付返回结果,只需要添加AlipaySDK.bundle和AlipaySDK.framework就行了。
这里再吐槽下,之前用的旧版本,和现在的版本相比,还不光是把类名字给改了,原先是用的类方法,现在新版又给改成了单例了。。还真是任性啊,这要是哪家小厂的SDK,估计早被弃用了把。。
发送订单的方法:
- (void)payOrder:(NSString *)orderStr
fromScheme:(NSString *)schemeStr
callback:(CompletionBlock)completionB
如果手机内没安装支付宝的app,会直接展现支付宝web支付界面,通过callback返回支付结果;
如果手机内安装了支付宝的app,会跳转到支付宝的app支付,然后通过openURL的回调返回支付结果。
支付宝的SDK只给了一个处理返回结果的方法,而不像其他第三方的SDK提供一个处理openURL的方法,所以你需要通过DEMO或者在第二个文档里找到处理openURL的方式:
if ([url.host isEqualToString:@"safepay"]) {
[[AlipaySDK defaultService] processOrderWithPaymentResult:url
standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
SDK也提供了一个处理openURL返回结果的方法
- (void)processOrderWithPaymentResult:(NSURL *)resultUrl
standbyCallback:(CompletionBlock)completionB
两个回调block都统一定义为typedef void(^CompletionBlock)(NSDictionary *resultDic);,返回了一个字典,但是SDK里完全没有提示有哪些key。。你可以在文档里找到,或者自己实际试一下,返回的信息如下:
resultStatus,状态码,SDK里没对应信息,第一个文档里有提到:
9000 订单支付成功
8000 正在处理中
4000 订单支付失败
6001 用户中途取消
6002 网络连接出错
memo, 提示信息,比如状态码为6001时,memo就是“用户中途取消”。但千万别完全依赖这个信息,如果未安装支付宝app,采用网页支付时,取消时状态码是6001,但这个memo是空的。。(当我发现这个问题的时候,我就决定,对于这么不靠谱的SDK,还是尽量靠自己吧。。)
result,订单信息,以及签名验证信息。如果你不想做签名验证,那这个字段可以忽略了。。
如果你对支付的安全性不那么在意或重视的话,到这里就可以完成支付宝的集成了。如果想更加安全,还是需要增加下面的签名验证的。
首先,RSA只是一种算法,所以你可以使用任何一种开源的、或者自己去实现这个算法来实现签名和验证的目的。
在整个流程当中,因为涉及到了RSA公钥、私钥的生产,RSA的签名、验证签名,SHA1值的计算,base64和URL编码,所以支付宝用了一个开源的代码来统一解决这些问题,就是(顺便再吐槽下,这DEMO里一放openssl,不知道又会引来多少公司的产品里使用openssl了,估计阿里自己也没少用,什么时候都能跟老罗、华为一样去点呢。。)
如果你想省事,也用openssl,那你需要把这些东西都加入到项目中:DEMO中的openssl目录头文件,两个库文件libcrypto.a libssl.a,DEMO里支付宝自己写的Util目录
上面说了,订单签名应该用私钥,但是把私钥放到app里其实本身就不安全,因为你的app是分发到用户手里的,私钥应该放在自己的手里,分发出去的应该是公钥。所以私钥最好是放在自己的服务器上,订单加密这个工作放在服务器端来做,服务器将包含签名的订单信息返回给app,app再通过SDK发送给支付宝,这样会更安全些;而且服务器也能掌握所有的订单状况。
如果你非要将私钥集成到app里,那可以参考SDK的DEMO,因为这个DEMO就是在app本地通过私钥做的订单签名。。
支付结果签名验证
上面的回调block提到了返回的内容,返回的支付结果中的result字段里是带有订单信息和签名信息的,所以签名验证就是需要这个字段的值。
文档中有一个这个字段的例子,实际结果没有换行,我换一下行便于阅读:
partner="8171"&seller_id=""&out_trade_no="-6177"&subject="测试"&body="测试测试"&total_fee="0.01"&notify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&success="true"
&sign_type="RSA"
&sign="hkFZr+zE9499nuqDNLZEF7W75RFFPsly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE+HCLiBXrPDNdLKCZ gSOIqmv46TfPTEqopYfhs+o5fZzXxt34fwdrzN4mX6S13cr3UwmEV4L3Ffir/02RBVtU="
总共分为三个部分
第一部分是订单信息,每个字段的具体含义可以在文档里找;
中间sign_type是签名用的算法,文档里说了,目前只支持RSA;
最后的sign就是签名值。
验证的步骤如下:
首先把订单信息和签名值分别提取出来(SDK居然都不给处理好。。)
订单信息就是sign_type的连字符&之前的所有字符串
签名值是sign后面双引号内的内容,注意签名的结尾也是=,所以不要用split字符串的方式提取
如果你想简单,可以直接使用Util目录下的DataVerifier来作签名验证
- (BOOL)verifyString:(NSString *)string withSign:(NSString *)signS
第一个参数就是订单信息,第二个参数就是签名值。
其实不使用openssl,用其他第三方RSA的开源代码也是可以的。可以看下DEMO里openssl_wrapper的源码和SDK的文档。
对于订单信息,先做一个base64编码(DEMO中这个还要调openssl来实现。。),再计算SHA1的值(这个也可以完全不用openssl,苹果的库中都有的。。),然后再签名比对。
对于公钥,如果使用其他第三方代码,需要注意格式问题。支付宝的DEMO实现中,是把这个公钥又转回成openssl生成的本地文件格式,然后再写入本地文件,再让openssl读取出来使用。。
以上,就是支付宝 iOS SDK的一些介绍。总体来说,我觉得能靠自己处理的地方还是尽量不要依赖这个不太靠谱的SDK了。。微信支付、支付宝企业版收费费率及限额详情一览
目前市场上最主流的在线支付产品是支付宝与微信支付,在接入这两款产品之前,需要了解最重要的两个因素莫过于费率与限额。钱台整理了支付宝与微信支付移动端产品的费率及限额情况,为正在准备接入在线支付的创业公司提供参考资料。
一、微信支付
微信支付有三款产品,分别是微信公众号支付、微信扫码支付、微信APP支付:
微信公众号支付:应用于微信公众号内环境的支付方式。
微信扫码支付:商家生成二维码,以微信扫码的方式进行付款的支付方式。
微信APP支付:应用于手机或其他移动设备内APP调起微信支付的方式。
三款产品费率一致:
主要银行储蓄卡限额:
主要银行信用卡限额:
二、支付宝
支付宝在移动端有两款产品,移动支付与手机网站支付:
移动支付:是一种程序式的支付方式,在手机、掌上电脑等无线设备的应用程序内,买家可通过支付宝进行付款购买特定服务或商品,资金即时到账。
手机网站支付:应用于手机、掌上电脑等无线设备的网页上,通过网页跳转或浏览器自带的支付宝快捷支付实现买家付款的功能。
两款产品费率一致:
主要银行储蓄卡限额:
主要银行信用卡限额:
支付宝 微信 苏宁易付宝渠道推广商
电子支付时代的到来,势不可挡,领先的移动支付服务商。智能便民,支付终端,高额长期分润,高额推荐费,朝阳行业,诚邀全国各级城市代理商及合作伙伴。
加盟专线:182- &
平安好医生App项目:
利民好项目火力全开,诚邀各级城市代理商,线下不限制区域,只要用户下载App就有钱拿,周结算一次。
具体要求电话:182-
下载APP也可以点击阅读原文,输入邀请码
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。手机App集成微信支付&支付宝-iOS(Swift)& Android完整版,包括Server端实现
等2人欣赏。
之前做App端支付集成,晚上搜索了不是资料,可是所有blog基本上都不全面,要么只有iOS,要么只有Android,而且很少文章介绍服务端实现。最近花了两天多时间整理了一下App集成微信支付&支付宝的全过程,包括 iOS Swift版,Android版,以及Server端实现. Github上有Demo,下载后修改配置文件直接可以直接运行。以下是所有文章链接。
如果要了解整个支付流程可以阅读文章。
如果不想看本文的话可以直接到Github。下载源码后只需要修改MyConstants.swift文件中的支付宝相关账号即可运行。
到支付宝商家服务网页申请快捷支付。
首先从支付宝开放平台. 解压后的目录下包含「服务端demo」和「客户端demo」。「客户端demo」包含了集成支付宝所需要的所有文件。
整个支付流程我在文章中有详细描述。
为了保证安全,防止支付结果被截获,在生成订单和处理支付结果的时候就需要做安全校验。生成订单时对数据签名,收到支付结果时对数据进行签名验证,以检验数据是否被篡改过。支付宝目前采用RSA加密方式做签名验证。
除了可加解密外,还可用来作签名校验。
简单的说,RSA会生成一个私钥和一个公钥,私钥你应该独自保管,公钥你可以分发出去。
做签名验证时,你可以用私钥对需要传输的数据做签名加密,生成一个签名值,之后分发数据,接收方通过公钥对签名值做校验,如果一致则认为数据无篡改。
生成公钥和私钥
用openssl生成商户的公钥和私钥,私钥用于提交支付申请时加密,而公钥要在商家服务页面上提交,换取到支付宝的公钥。
对于iOS来说,私钥要转为PKCS8格式,即下述代码的第三行!
openssl genrsa -out rsa_private_key.pem 1024
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
首先把 AlipaySDK.framework 和 AlipaySDK.bundle 拖到你的项目里面。然后把demo目录下面的openssl和Util两个目录拖到你的工程下面。然后在 Build Settings => Header Search Paths => 添加 "$(SRCROOT)/openssl" 和 "$(SRCROOT)/Util"
否则会有类似报错:"openssl/asn1.h file not found"。
在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖:
其中,需要注意的是:
如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib
新建一个Bridging-Header.h文件,并把该文件的路径添加到 Build Settings => Objective-C Bridging Header。然后在该文件中添加下面两行:
#import &AlipaySDK/AlipaySDK.h&
#import "RSADataSigner.h"
如果你的服务器不支持Https,请在info.plist文件里面添加如下代码:
&key&NSAppTransportSecurity&/key&
&key&NSAllowsArbitraryLoads&/key&
由于支付包支付成功后需要返回App,那么你就需要设置你App独有的Schema:选择你的项目,选择Info,在URL Types中添加一个schema,并设置Url Schemas.
到这一步,整个配置过程就已经完成了。下面的工作就是Coding部分了。
let aliOrder = AlipayOrder(partner: AlipayPartner, seller: AlipaySeller, tradeNO: order.id, productName: order.title, productDescription: order.content, amount: order.price, notifyURL: AlipayNotifyURL, service: "mobile.securitypay.pay", paymentType: "1", inputCharset: "utf-8", itBPay: "30m", showUrl: "", rsaDate: nil, appID: nil)
let orderSpec = aliOrder.description //orderA.description
let signer = RSADataSigner(privateKey: AlipayPrivateKey)
let signedString = signer.signString(orderSpec)
let orderString = "(orderSpec)&sign="(signedString)"&sign_type="RSA""
print(orderString)
AlipaySDK.defaultService().payOrder(orderString, fromScheme: AppScheme, callback: {[weak self] resultDic in
if let strongSelf = self {
print("Alipay result = (resultDic as Dictionary)")
let resultDic = resultDic as Dictionary
if let resultStatus = resultDic["resultStatus"] as? String {
if resultStatus == "9000" {
strongSelf.delegate?.paymentSuccess(paymentType: .Alipay)
let msg = "支付成功!"
let alert = UIAlertView(title: nil, message: msg, delegate: nil, cancelButtonTitle: "好的")
alert.show()
//strongSelf.navigationController?.popViewControllerAnimated(true)
strongSelf.delegate?.paymentFail(paymentType: .Alipay)
let alert = UIAlertView(title: nil, message: "支付失败,请您重新支付!", delegate: nil, cancelButtonTitle: "好的")
alert.show()
AlipayOrder的description属性如下:
var description:String {
var desc = ""
desc += "partner="(partner)""
desc += "&seller_id="(seller)""
desc += "&out_trade_no="(tradeNO)""
desc += "&subject="(productName)""
desc += "&body="(productDescription)""
desc += "&total_fee="" + amount.format("0.2") + """
desc += "?ify_url="(notifyURL)""
desc += "&service="(service)""
desc += "&payment_type="(paymentType)""
desc += "&_input_charset="(inputCharset)""
desc += "&it_b_pay="(itBPay)""
desc += "&show_url="(showUrl)""
if let rsaDate = rsaDate {
desc += "&sign_date=(rsaDate)"
if let appID = appID {
desc += "&app_id=(appID)"
return desc
通知服务器支付成功
如果支付成功后,支付宝服务器会向你的服务器 notify URL 发起支付成功的请求。这样就可以在服务端实现一些相关的业务逻辑,比如标记订单为已支付,发短信给用户等。notify URL的具体实现请查看文章
查看完整代码请
iOS&Android集成支付宝-server篇(PHP)
在上一篇文章中,我介绍了如何在iOS中集成支付宝。在文章中,我介绍了整个支付流程,在App支付成功后返回后,服务器并不知道相关的订单已经支付成功。在用户付款成功后,支付宝会调用你的服务器Notify URL,告诉你支付成功了。所以服务端主要需要实现的工作就是验证签名以及。
整个验证过程的实验可以参考官方的demo相关代码,官方demo中有一个AlipayNotify类,里面的verifyNotify方法实现了验证过程。验证通过后,就可以做相应的业务逻辑的处理了。需要注意的是支付宝是用POST方式发送通知信息,因此该页面中获取参数的方式为$POST['outtradeno']形式。所有的参数说明请参考官方文档。 所有这些参数中,我们最关心的就是如下几个:
outtradeno : 商户网站唯一订单号(通常是你网站的订单ID)
tradeno: 支付宝交易号 (支付宝系统中的交易流水号,请记录到你的DB,以便以后对账)
tradestatus:交易状态 (TRADESUCCESS 或者 TRADE_FINISHED 就表示支付成功)
获取到这些信息后就可以从自己系统DB里面通过outtradeno查询出相应的订单,标记为支付成功,并记录下相应的交易流水号trade_no. 需要注意的是,处理玩业务逻辑后需要返回"success"给支付宝。实现代码如下:
$alipay_config_app = $this-&config-&item('alipay_config_app');
$alipayNotify = new AlipayNotify($alipay_config_app);
$verify_result = $alipayNotify-&verifyNotify();
if($verify_result) {//验证成功
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//交易状态
$trade_status = $_POST['trade_status'];
$this-&log_result('alipay_notify',"【支付宝回调App】:n".json_encode($_POST)."n");
if($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
$order = $this-&order_model-&get_order_info($out_trade_no);
if($order['TradeStatus'] != 'TRADE_FINISHED' && $order['TradeStatus'] != 'TRADE_SUCCESS'){
$data = array('TradeStatus'=&$trade_status,'TradeNo'=&$trade_no,'PayTime'=&time(),'PayType'=&'alipay');
$this-&order_model-&update_order_info($out_trade_no,$data);
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
echo "success";
//请不要修改或删除
//验证失败
echo "fail";
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
完整的代码请。
Server端是基于实现的,如果你不熟悉的话也没有关系,下载demo后打开 /application/config/myconfig.php 文件,将数组 alipayconfig 中的 partner,key,selleremail,替换成你自己的配置即可运行。
在本文章Demo实现过程中,我没有采用任何安全验证措施,在实际开放过程中Server端API是需要根据自身情况采取相应安全策略的。
iOS集成微信支付-Swift版
微信支付在微信红包的推动发展势头越来越猛,甚至有超过支付宝的趋势,那么在App集成微信支付也是比不可少了。我最近在一个项目中集成微信支付遇到了不少问题,Google了不少资料才搞定,不得不吐槽一下微信支付的官方接口文档,实在太简陋了。我希望这篇文章能够帮到需要在iOS APP中集成微信支付的朋友。
如果不想看文章可以直接到Github下载Demo源码。下载源码后只需要修改MyConstants.swift文件中的微信支付相关账号即可运行。
整个支付流程我在文章《手机App集成微信支付&支付宝-iOS&Android完整版》中有详细描述,这里不再重复。
开发者账号
要在App中集成微信支付的话,首先需要到微信开放平台注册开发者账号。注意是「微信开放平台」,而不是「微信公众平台」。微信公众平台是和公众号开发相关,微信开放平台提供App微信登陆,微信支付等接口。 想详细了解微信支付的同学请点击此链接访问官方文档。
账号注册完成后还需要通过开发者资质认证后,才能获得微信登录、智能接口、公众号第三方平台开发等高级能力。认证费用是300元/年,一年到期后再交钱审核。目前微信只支持企业认证,个人开发者是无法认证的。
微信商户平台
要获取支付权限,还需要登陆「微信商户平台」 和腾讯签约。签约需要扫描上传「营业执照」、「组织机构代码证」、「经营许可证/资格证」、「身份证」等信息。在微信商户平台可以进行查询交易订单,提现等功能。在此需要说明一下的是,微信商户平台和财付通数据其实是通的,在微信和财付通都可以看到同样的交易记录。
登录微信开放平台,进入管理中心,创建移动应用。创建完成后你将得到应用的AppID和AppSecret。创建完应用以后还需要设置「开发信息」
点击「修改」,设置好Bundle ID、Appstore下载地址等信息。
点击该链接到官方网站下载SDK及Demo
解压后的Demo中在文件夹SDKExport下面有 libWeChatSDK.a 、WXApi.h 、 WXApiObject.h 这三个文件。把这三个文件拖到你的项目里面,并在Bridging-Header.h文件中添加如下两行代码。
#import "WXApi.h"
#import "WXApiObject.h"
设置URL Types
URL Schema中填写之前创建的应用的AppID
在Appdelegate中注册微信支付
WXApi.registerApp(WX_APPID, withDescription: "apppaydemo1.0")
获取PrePay信息并发起支付请求
微信支付和支付宝支付流程有些不一样,微信支付会在真正发起支付请求钱先发起PrePay(预支付)请求,然后利用PrePay发起支付请求。Demo中的PrePay是在客户端生成的,但是更加安全的方式是在服务端生成PrePay。我这里是在服务器端获取Prepay信息的,具体实现请查看文章《OS&Android集成微信支付-Server篇》。返回的PrePay信息结构如下:
"appid": "wxxxxxxxxxxx",
"noncestr": "Hk8dsZoMOdTXGjkJ",
"package": "Sign=WXPay",
"partnerid": "",
"prepayid": "wx0000",
"sign": "B4879FFFA8BE2D027A3B8",
"timestamp": "",
"success": true
获取Prepay代码:
@ func weichatPayAction(sender: AnyObject) {
DataService.wxPrePay(order.id) {[weak self] (prepay, error) -& () in
if let strongSelf = self {
if let prepay = prepay {
let req = PayReq()
req.openID = prepay.appID
req.partnerId = prepay.partnerID
req.prepayId = prepay.prepayID
req.nonceStr = prepay.noncestr
req.timeStamp = UInt32(prepay.timestamp)
req.package = prepay.package
req.sign = prepay.sign
WXApi.sendReq(req)
strongSelf.delegate?.paymentFail(paymentType: .Weichat)
let alert = UIAlertView(title: nil, message: "获取支付信息失败,请重新支付!", delegate: nil, cancelButtonTitle: "好的")
alert.show()
App支付完成后返回App, 在Appdelegate中实现协议 WXApiDelegate 中的 onResp方法
func onResp(resp: BaseResp!) {
var strTitle = "支付结果"
var strMsg = "(resp.errCode)"
if resp.isKindOfClass(PayResp) {
switch resp.errCode {
NSNotificationCenter.defaultCenter().postNotificationName(WXPaySuccessNotification, object: nil)
strMsg = "支付失败,请您重新支付!"
print("retcode = (resp.errCode), retstr = (resp.errStr)")
let alert = UIAlertView(title: nil, message: strMsg, delegate: nil, cancelButtonTitle: "好的")
alert.show()
通知服务器支付成功
如果支付成功后,微信服务器会向你的服务器 notify URL 发起支付成功的请求。这样就可以在服务端实现一些相关的业务逻辑,比如标机订单为已支付,发短信给用户等。notify URL的具体实现请查看文章
可能会遇到的错误
如果遇到类似 "WXApiObject.h error:Expected a type : - (void) setThumbImage:(UIImage*)" 的错误,打开文件WXApiObject.h,在顶部加上 #import &UIKit/UIKit.h> 即可
iOS9以后苹果默认使用HTTPS,如果服务器端是HTTP协议,那么就需要在 info.plist 中添加Key:NSAppTransportSecurity, Value设置为 NSAllowsArbitraryLoads
如果你同时用了ShareSDK,那么很有可能会和ShareSDK冲突,导致不能跳转到微信。解决方案就是用微信sdk中的内容替代ShareSDK/extends/WeChatSDK 目录下的文件libWeChatSDK.a, WXApi.h, WXApiObject.h
查看完整代码请
iOS&Android集成微信支付-Server篇(PHP)
在上一篇文章中,我介绍了如何在iOS中集成微信支付。在支付过程中有一步是需要获取PrePay数据,至于如何获取,我会在本文后面详细介绍。在文章中,我介绍了整个支付流程,在App支付成功返回后,你的服务器并不知道相关的订单已经支付成功。这时候微信服务器会向你设置的服务器Notify URL发送POST请求,告诉你支付成功了。所以服务端主要需要实现的工作就是验证签名以及验证是否是微信发来的通知。
获取PrePay
在中是这样描述的:
除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。
关于获取预支付接口的请求参数、返回结果以及错误码请。有一点需要注意的是微信支付的接口参数用的是XML格式。下面就是获取PrePay的代码:
$wxpay_config = $this-&wxpay_config = $this-&my_config['wxpay_config'];
//var_dump($wxpay_config);
$APP_ID = $wxpay_config['app_id'];
$APP_SECRET = $wxpay_config['app_secret'];
//appsecret
$MCH_ID=$wxpay_config['mch_id'];
$PARTNER_ID = $wxpay_config['partner_id'];
$NOTIFY_URL = $wxpay_config['notify_url'];
if (!$out_trade_no) {
$this-&display_error(400,'请求是无效的');
$order = $this-&order_model-&get_order_info($out_trade_no);
if (!$order) {
$this-&display_error(1,'请求是无效的');
//STEP 1. 构造一个订单。
$order=array(
"body" =& $order['Subject'],
"appid" =& $APP_ID,
"device_info" =& "APP-001",
"mch_id" =& $MCH_ID,
"nonce_str" =& mt_rand(),
"notify_url" =& $NOTIFY_URL,
"out_trade_no" =& $out_trade_no,
"spbill_create_ip" =& $this-&input-&ip_address(),
"total_fee" =& intval($order['TotalFee'] * 100),//注意:前方有坑!!!最小单位是分,跟支付宝不一样。1表示1分钱。只能是整形。
"trade_type" =& "APP"
ksort($order);
//STEP 2. 签名
foreach ($order as $key =& $value) {
if($value&&$key!="sign"&&$key!="key"){
$sign.=$key."=".$value."&";
$sign.="key=".$PARTNER_ID;
$sign=strtoupper(md5($sign));//echo $sign.'
//STEP 3. 请求服务器
foreach ($order as $key =& $value) {
$xml.="&".$key."&".$value."n";
$xml.="".$sign."n";
$opts = array(
=& 'POST',
=& 'Content-type: text/xml',
'content' =& $xml
"ssl"=&array(
"verify_peer"=&false,
"verify_peer_name"=&false,
= stream_context_create($opts);
$result = file_get_contents('https://api.mch./pay/unifiedorder', false, $context);
$result = simplexml_load_string($result,null, LIBXML_NOCDATA);
if ($result-&return_code == 'SUCCESS' && $result-&result_code == 'SUCCESS') {
$prepay=array(
"noncestr"=&"".$result-&nonce_str,
"prepayid"=&"".$result-&prepay_id,//上一步请求微信服务器得到nonce_str和prepay_id参数。
"appid"=&$APP_ID,
"package"=&"Sign=WXPay",
"partnerid"=&$MCH_ID,
"timestamp"=&"".time(),
"sign"=&""
ksort($prepay);
foreach ($prepay as $key =& $value) {
if($value&&$key!="sign"&&$key!="key"){
$sign.=$key."=".$value."&";
$sign.="key=".$PARTNER_ID;
$sign=strtoupper(md5($sign));
$prepay['sign'] = $
$prepay['success'] =
$prepay=array(
"success" =& false,
"noncestr"=&"",
"prepayid"=&"",
"appid"=&$APP_ID,
"package"=&"Sign=WXPay",
"partnerid"=&$MCH_ID,
"timestamp"=&"".time(),
"sign"=&"",
"return_msg"=&$result-&return_msg
$this-&response($prepay, 200);
此处有一个坑需要注意,微信支付接口的金额最小单位是分,跟支付宝不一样,1表示1分钱,且只能是整形。
客户端App通过该API获取到PrePay信息有就可以发起支付请求了。客户端的实现代码请查看文章。
Notify URL
前面说过,这个URL是支付成功后微信调用的。那么微信Server是如何知道这个URL的呢?其实是在前面请求PrePay的时候通过参数notifyurl传过去的。
微信调用支付结果通知的详细参数请访问文档。同样,参数格式也是XML。
所有这些参数中,我们最关心的应该是下面几个:
returncode :返回状态码。SUCCESS/FAIL
resultcode : 交易标识,交易是否成功 SUCCESS/FAIL
outtradeno : 商户订单号, 需要在你的数据库能够唯一标志订单
transactionid :微信支付订单号,流水号。记录到你的数据库方便对账用
获取到这些信息后就可以从自己系统DB里面通过outtradeno查询出相应的订单,标记为支付成功,并记录下相应的交易流水号transactionid. 需要注意的是,处理玩业务逻辑后需要返回"returncode"为"success"给微信服务器。
Notify实现代码如下:
* 微信支付Notify
function wxpay_notify(){
//使用通用通知接口
$notify = new Notify_pub();
//存储微信的回调
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$notify-&saveData($xml);
//验证签名,并回应微信。
//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
//尽可能提高通知的成功率,但微信不保证通知最终能成功。
if($notify-&checkSign() == FALSE){
$notify-&setReturnParameter("return_code","FAIL");//返回状态码
$notify-&setReturnParameter("return_msg","签名失败");//返回信息
$notify-&setReturnParameter("return_code","SUCCESS");//设置返回码
$returnXml = $notify-&returnXml();
echo $returnX
//==商户根据实际情况设置相应的处理流程,此处仅作举例=======
//以log文件形式记录回调信息
$log_type="wxpay_notify";//log文件路径
$this-&log_result($log_type,"【接收到的notify通知】:n".$xml."n");
if($notify-&checkSign() == TRUE) {
if ($notify-&data["return_code"] == "FAIL") {
//此处应该更新一下订单状态,商户自行增删操作
$this-&log_result($log_type,"【通信出错】:n".$xml."n");
} elseif ($notify-&data["result_code"] == "FAIL") {
//此处应该更新一下订单状态,商户自行增删操作
$this-&log_result($log_type,"【业务出错】:n".$xml."n");
//此处应该更新一下订单状态,商户自行增删操作
$this-&log_result($log_type,"【支付成功】:n".$xml."n");
$out_trade_no = $notify-&data['out_trade_no'];
$trade_no = $notify-&data['transaction_id'];
$order = $this-&order_model-&get_order_info($out_trade_no);
if($order['TradeStatus'] != 'TRADE_FINISHED' && $order['TradeStatus'] != 'TRADE_SUCCESS'){
$data = array('TradeStatus'=&'TRADE_SUCCESS','TradeNo'=&$trade_no,'PayTime'=&time(),'PayType'=&'wxpay');
$this-&order_model-&update_order_info($out_trade_no,$data);
完整的实现代码请。
Server端是基于实现的,如果你不熟悉的话也没有关系,下载demo后打开 /application/config/myconfig.php 文件,将数组 wxpayconfig 中的 appid,appsecret,mchid, partnerid,notifyurl,替换成你自己的配置即可运行。
其中 appid,appsecret 是你在微信开放平台创建的应用。
mch_id为「微信支付商户号」,登录即可看到。
在本文章Demo实现过程中,我没有采用任何安全验证措施,在实际开放过程中Server端API是需要根据自身情况采取相应安全策略的。
顶一下教程。
强 烈 支 持
淫才,还有啥好东西一起放出来
@ 只是自己在开发过程中遇到了一些坑,所以写教程出来希望其他不要踩坑

我要回帖

更多关于 企业版支付宝收费标准 的文章

 

随机推荐