APP⽀付,⽀付宝APP⽀付demo
最近公司新开发的APP中,需要集成⽀付和⽀付宝⽀付,2个平台申请的都是APP⽀付。这是个⼈第⼀次单独的,完整的做完2个平台的⽀付。
这⾥我主要⽤到了2个接⼝:⽀付接⼝,订单查询接⼝,虽然2个平台的⽂档都挺齐全,但开发下来,还是踩了不少坑,记录下来,或许对后来⼈有⽤。先来说⽀付宝SDK:
取得好成绩的成语  了解3个概念:应⽤公钥,应⽤私钥和⽀付宝公钥
  开发⼈员⽤⽀付宝提供的秘钥⽣成⼯具⽣成的秘钥,即为应⽤公钥和应⽤私钥。
  开发⼈员在给⽀付宝APP配置应⽤公钥后,⽀付宝主动⽣成了⼀个公钥,即为⽀付宝公钥。
  配置如下图⽰:
  需要把这个⽀付宝公钥保存下来,具体使⽤场景,请看后续说明。
  这⾥个⼈⽤到了2个接⼝,⽣成⽀付订单信息和订单查询。
滴滴打车注册司机
  ⽀付宝提供了服务端SDK的下载:
  其⽬录显⽰:
  下⾯直接给出⽀付、回调、订单查询的代码:
// ⽣成⽀付信息
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⽀付:
  审核通过后,需要配置开发信息
  服务端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 更新订单状态,⽤户账户余额,账户变化⽇志    }
}