牛骨文教育服务平台(让学习变的简单)
博文笔记

基于PHP的APP微信支付开发(三)

创建时间:2016-12-14 投稿人: 浏览次数:3040
前面介绍了APP微信开发的基本步骤,这次介绍一下开发前的准备工作。 一、注册、认证、创建APP应用并进行开户审核等工作 链接如下 https://open.weixin.qq.com/cgi-bin/frame?t=home/app_tmpl&lang=zh_CN 相关流程如下: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=&lang=zh_CN 二、开始开发 开发者文档参考链接:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1 APP支付模式为(ps:标注蓝色的即为服务器端需要做的操作): 商户系统和微信支付系统主要交互说明: 步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。 步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。 步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay 步骤4:商户APP调起微信支付。 步骤5:商户后台接收支付通知。 步骤6:商户后台查询支付结果。 1、下载PHP服务器开发demo 下载demo链接:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 2、开同微信支付功能,在Demo的lib/WxPay.Config.php中配置各个信息 class WxPayConfig { //=======【基本信息设置】===================================== // /** * TODO: 修改这里配置为您自己申请的商户信息 * 微信公众号信息配置 * * APPID:绑定支付的APPID(必须配置,开户邮件中可查看) * * MCHID:商户号(必须配置,开户邮件中可查看) * * KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置) * 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert * * APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置), * 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN * @var string */ const APPID = "wx426b3015555a46be"; const MCHID = "1225312702"; const KEY = "e10adc3949ba59abbe56e057f20f883e"; const APPSECRET = "01c6d59a3f9024db6336662ac95c8e74"; //=======【证书路径设置】===================================== /** * TODO:设置商户证书路径 * 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要,可登录商户平台下载, * API证书下载地址:https://pay.weixin.qq.com/index.php/account/api_cert,下载之前需要安装商户操作证书) * @var path */ const SSLCERT_PATH = "../cert/apiclient_cert.pem"; const SSLKEY_PATH = "../cert/apiclient_key.pem"; //=======【curl代理设置】=================================== /** * TODO:这里设置代理机器,只有需要代理的时候才设置,不需要代理,请设置为0.0.0.0和0 * 本例程通过curl使用HTTP POST方法,此处可修改代理服务器, * 默认CURL_PROXY_HOST=0.0.0.0和CURL_PROXY_PORT=0,此时不开启代理(如有需要才设置) * @var unknown_type */ const CURL_PROXY_HOST = "0.0.0.0";//"10.152.18.220"; const CURL_PROXY_PORT = 0;//8080; //=======【上报信息配置】=================================== /** * TODO:接口调用上报等级,默认紧错误上报(注意:上报超时间为【1s】,上报无论成败【永不抛出异常】, * 不会影响接口调用流程),开启上报之后,方便微信监控请求调用的质量,建议至少 * 开启错误上报。 * 上报等级,0.关闭上报; 1.仅错误出错上报; 2.全量上报 * @var int */ const REPORT_LEVENL = 1; } 3、统一下单,将返回的结果传递给客户端处理 function dopayment_serviceorder($serviceorder) { //① 获取后台中的相关数据 $host = "http://".$_SERVER["HTTP_HOST"]; $notify_url =$host."/at/wxopenplatformpayagent/notify_url.html";//接受微信支付结果通知url $appid = WxPayConfig::APPID; $body = $serviceorder["order_title"]; $total_fee = $serviceorder["order_dealprice"] * 100; $out_trade_no = $serviceorder["order_id"].date("YmdHis");
//②、统一下单,生成预支付交易单prepayid $input = new WxPayUnifiedOrder(); $input->SetBody($body); //设置商品或支付单简要描述 $input->SetOut_trade_no($out_trade_no); //设置商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号 $input->SetTotal_fee($total_fee); //设置订单总金额,只能为整数,详见支付金额 $input->SetTime_start(date("YmdHis")); //设置订单生成时间,格式为yyyyMMddHHmmss $input->SetTime_expire(date("YmdHis", time() + 60*10)); //设置订单失效时间,格式为yyyyMMddHHmmss $input->SetNotify_url($notify_url); //设置接收微信支付异步通知回调地址 $input->SetTrade_type("APP"); //设置类型如下:JSAPI,NATIVE,APP $order_data = WxPayApi::unifiedOrder($input); //统一下单
$order_data["timestamp"] = time(); $str = "appid=".$order_data["appid"]."&noncestr=".$order_data["nonce_str"]."&package=Sign=WXPay&partnerid=".WxPayConfig::MCHID."&prepayid=".$order_data["prepay_id"]."&timestamp=".$order_data["timestamp"];
//③ 重新生成签名,并将结果返回给客户端 $order_data["sign"] = strtoupper(md5($str."&key=".WxPayConfig::KEY)); $parameter = array( "appid" => $order_data["appid"], "partnerid"=>$order_data["mch_id"], "prepayid"=>$order_data["prepay_id"], "package"=>"Sign=WXPay", "noncestr"=>$order_data["nonce_str"], "timestamp"=>$order_data["timestamp"], "sign" => $order_data["sign"] ); return json_encode($parameter); } 4、调起支付接口--客户端完成 5、支付结果通知--统一下单时传递的notify_url 支付完成后,微信会把相关的支付结果和用户信息发送给商户,商户需要接收处理并返回应答 根据支付结果对订单进行处理 <?php ini_set("date.timezone","Asia/Shanghai"); error_reporting(E_ERROR);
require_once "../lib/WxPay.Api.php"; require_once "../lib/WxPay.Notify.php"; require_once "log.php";
//初始化日志 $logHandler= new CLogFileHandler("../logs/".date("Y-m-d").".log"); $log = Log::Init($logHandler, 15);
class PayNotifyCallBack extends WxPayNotify { //查询订单 public function Queryorder($transaction_id) { $input = new WxPayOrderQuery(); $input->SetTransaction_id($transaction_id); $result = WxPayApi::orderQuery($input); Log::DEBUG("query:" . json_encode($result)); if(array_key_exists("return_code", $result) && array_key_exists("result_code", $result) && $result["return_code"] == "SUCCESS" && $result["result_code"] == "SUCCESS") { return true; } return false; } //重写回调处理函数 public function NotifyProcess($data, &$msg) { Log::DEBUG("call back:" . json_encode($data)); $notfiyOutput = array(); if(!array_key_exists("transaction_id", $data)){ $msg = "输入参数不正确"; return false; } //查询订单,判断订单真实性 if(!$this->Queryorder($data["transaction_id"])){ $msg = "订单查询失败"; return false; } //根据 $data["out_trade_no"] 订单号 更新订单状态 //执行更新 return true; } }

Log::DEBUG("begin notify"); $notify = new PayNotifyCallBack(); $notify->Handle(false); 6、关闭订单
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。