微信APP支付同公众号支付调用的接口一样,部分参数不一样,需要特别注意。
相关签名算法实现、随机数生成、数组XML转换、curl发送post请求可参看上一篇博客《支付-微信公众号》。
统一下单接口:
public function prePay($body,$userIp,$orderNo, $price){ $postData = [ "appid" => self::OPEN_ID, "mch_id" => self::MCH_ID, "nonce_str" => self::getNonceStr(), "body" => $body, "out_trade_no" => $orderNo, "total_fee" => (int)($price*100),//微信以分为单位 "spbill_create_ip" => $userIp, "notify_url" => self::notify_url, "trade_type" => "APP" ]; $postData["sign"] = self::getSign($postData, self::APP_KEY); $postData = self::arrayToXml($postData); $response = self::xmlToArray(self::curlPost(self::API_UNIFIED_ORDER, $postData)); if (isset($response["return_code"]) && $response["return_code"] == "SUCCESS"){ if ($response["result_code"] == "SUCCESS"){ $res = [ "prepayid" => $response["prepay_id"], "partnerid" => self::MCH_ID, "appid" => self::OPEN_ID, "package" => "Sign=WXpay", "noncestr" => self::getNonceStr(), "timestamp" => time() ]; $res["sign"] = self::getSign($res, self::APP_KEY); return $res;//app端调起支付所需参数 } } return []; }
调起微信APP支付所需的参数中,要特别注意package参数,APP支付固定写成“Sign=WXpay”,而不是公众号支付时的“prepay_id=***”,官方文档上示例是“Sign=WXPay”,但似乎在ios会出问题,反正写成“Sign=WXpay”能调起。
关单接口、查询接口、异步通知接口等等,同公众号支付基本无差别,传入对应参数就可以了,注意app支付和公众号支付用的参数appid、mchid之类的是不同的,要分别使用开放平台和公众平台给的值
