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

前面介绍了APP微信开发的基本步骤,这次介绍一下开发前的准备工作。
一、注册、认证、创建APP应用并进行开户审核等工作
链接如下
相关流程如下:
二、开始开发
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
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、关闭订单
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值