微信APP支付,支付宝APP支付demo
2018-01-19 10:23
369 查看
最近公司新开发的APP中,需要集成微信支付和支付宝支付,2个平台申请的都是APP支付。这是个人第一次单独的,完整的做完2个平台的支付。
这里我主要用到了2个接口:支付接口,订单查询接口,虽然2个平台的文档都挺齐全,但开发下来,还是踩了不少坑,记录下来,或许对后来人有用。
先来说支付宝SDK:
了解3个概念:应用公钥,应用私钥和支付宝公钥
开发人员用支付宝提供的秘钥生成工具生成的秘钥,即为应用公钥和应用私钥。
开发人员在给支付宝APP配置应用公钥后,支付宝主动生成了一个公钥,即为支付宝公钥。
配置如下图示:
需要把这个支付宝公钥保存下来,具体使用场景,请看后续说明。
这里个人用到了2个接口,生成支付订单信息和订单查询。
支付宝提供了服务端SDK的下载:https://docs.open.alipay.com/54/106370/
其目录显示:
下面直接给出支付、回调、订单查询的代码:
微信支付:
在开发平台申请app支付:https://open.weixin.qq.com/
审核通过后,需要配置开发信息
服务端PHP的demo:
这里我主要用到了2个接口:支付接口,订单查询接口,虽然2个平台的文档都挺齐全,但开发下来,还是踩了不少坑,记录下来,或许对后来人有用。
先来说支付宝SDK:
了解3个概念:应用公钥,应用私钥和支付宝公钥
开发人员用支付宝提供的秘钥生成工具生成的秘钥,即为应用公钥和应用私钥。
开发人员在给支付宝APP配置应用公钥后,支付宝主动生成了一个公钥,即为支付宝公钥。
配置如下图示:
需要把这个支付宝公钥保存下来,具体使用场景,请看后续说明。
这里个人用到了2个接口,生成支付订单信息和订单查询。
支付宝提供了服务端SDK的下载:https://docs.open.alipay.com/54/106370/
其目录显示:
下面直接给出支付、回调、订单查询的代码:
// 生成支付信息 function pay() { $aop = new AopClient; $aop->gatewayUrl = '网关地址'; $aop->appId = 'alipay_appid'; $aop->rsaPrivateKey = '应用私钥'; $aop->signType = "RSA2"; $aop->alipayrsaPublicKey = '支付宝公钥'; $request = new AlipayTradeAppPayRequest(); $bizcontent = "{\"body\":\"账户充值\"," . "\"subject\": \"用户账户充值\"," . "\"out_trade_no\": \"订单号\"," . "\"timeout_express\": \"30m\"," . "\"total_amount\": \"订单金额\"," . "\"product_code\":\"QUICK_MSECURITY_PAY\"" . "}"; $request->setNotifyUrl('开发者回调地址'); $request->setBizContent($bizcontent); $response = $aop->sdkExecute($request); // 注意: 官方demo里,这里加了htmlspecialchars方法,其实是错误的,应该去掉,否则会报ALI38173错误 echo $response; } // 回调 function callback() { $aop = new AopClient (); $aop->alipayrsaPublicKey = '支付宝公钥'; // 支付宝回调是以POST方式提交过来的 $result = $aop->rsaCheckV1($_POST, null, $_POST['sign_type']); if ($result) { // TODO 验证订单号,支付金额,支付宝状态等信息 echo 'success'; } else { echo 'error'; } } // 订单查询 function queryOrder() { $aop = new AopClient (); $aop->signType = "RSA2"; $aop->gatewayUrl = '网关地址'; $aop->appId = 'appid'; $aop->rsaPrivateKey = '应用私钥'; // 注意:这里是支付宝公钥,不是应用公钥 $aop->alipayrsaPublicKey = '支付宝公钥'; $request = new AlipayTradeQueryRequest (); $request->setBizContent("{" . "\"out_trade_no\":\"订单号\"," . "\"trade_no\":\"交易单号\"" . "}"); $result = $aop->execute($request); $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response"; $resultCode = $result->$responseNode->code; if(! empty($resultCode) && $resultCode == 10000) { if ($result->$responseNode->trade_status == 'TRADE_SUCCESS') { // 支付成功, 更新订单状态,用户账户余额,账户变化日志 } } }
微信支付:
在开发平台申请app支付:https://open.weixin.qq.com/
审核通过后,需要配置开发信息
服务端PHP的demo:
// 生成支付信息 function pay() { $input = new WxPayUnifiedOrder(); $input->SetBody('支付标题'); $input->SetAttach('附加信息'); // 附加信息 $input->SetOut_trade_no('订单号'); $input->SetTotal_fee('订单金额,单位分'); //微信支付,单位(分) $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag('附属信息'); $input->SetNotify_url('回调地址'); $input->SetTrade_type("APP"); // 生成预支付订单ID:prepay_id $unifiedOrder = WxPayApi::unifiedOrder($input); // 生成签名,返回给APP前端调用 $result = makeWxPaySign($unifiedOrder); } // 生成签名 function makeWxPaySign($UnifiedOrderResult) { if(! array_key_exists("appid", $UnifiedOrderResult) || ! array_key_exists("prepay_id", $UnifiedOrderResult) || empty($UnifiedOrderResult['prepay_id'])) { throw new WxPayException("参数错误"); } $api = new WxPayAppPay(); $api->SetValue('appid', $UnifiedOrderResult["appid"]); $api->SetValue('package', "Sign=WXPay"); $api->SetValue('prepayid', $UnifiedOrderResult['prepay_id']); // 预支付订单号 $api->SetValue('partnerid', WxPayConfig::MCHID); // 商户号 $api->SetValue('noncestr', WxPayApi::getNonceStr()); // 随机数 $api->SetValue('timestamp', (string)time()); // 对上面参数进行签名 $api->SetValue('sign', $api->MakeSign()); return $api->GetValues(); } // 回调,继承微信SDK的回调类 class PayNotifyCallBack extends WxPayNotify { //重写回调处理函数 public function NotifyProcess($data, &$msg) { if (! array_key_exists("transaction_id", $data)) { return false; } // 调用订单查询方法,判断订单真实性 return true; } } // 订单查询 function queryOrder() { $input = new WxPayOrderQuery(); $input->SetTransaction_id('支付平台交易号'); $input->SetOut_trade_no('公司平台单号'); // 订单查询结果 $result = WxPayApi::orderQuery($input); if(array_key_exists("return_code", $result) && array_key_exists("result_code", $result) && array_key_exists('trade_state', $result) && $result["return_code"] == "SUCCESS" && $result["result_code"] == "SUCCESS" && $result["trade_state"] == "SUCCESS") { // 交易成功,todo 更新订单状态,用户账户余额,账户变化日志 } }
相关文章推荐
- 支付宝微信app 支付签名后台完整demo
- java支付宝和微信app支付(服务端处理)
- [置顶] 实现APP支付QQ,微信,支付宝三方的后端服务------php实现支付宝APP支付
- Android WebView 微信和支付宝H5调用本地app支付
- Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)
- 微信、支付宝App支付-JPay 简单而不简洁的App支付SDK
- wap站、手机APP 接入支付宝、微信、银联支付。
- Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)
- 微信,支付宝,百度钱包三种APP支付成功关闭浏览器
- Android平台,支付宝和微信app支付总结
- APP中微信,支付宝支付,退款接口从申请到开发过程
- 支付宝官网下载App支付服务端DEMO&S(Java、.net、php 4000 )
- iOS app被拒------iOS 提交应用到 APP Store 因包含微信和支付宝支付被拒
- Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)
- Java服务端接入支付宝APP支付及微信APP支付
- 支付宝支付手机网页支付(适用于微信开发)DEMO(沙箱环境)
- 梦行扫码付(收银台条码支付 微信钱包条码支付 支付宝二维码支付 手机APP钱包支付 PHP扫码支付 )
- APP支付(支付宝和微信生成客户端签名及回调验签)
- [置顶] 实现APP支付QQ,微信,支付宝三方的后端服务------php实现微信APP支付
- Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)