php 接入微信小程序虚拟支付功能

小天天天天    PHP    999+ 次    2023-10-19 18:46:10


最近有个业务是做一个短剧小程序,根据微信支付的要求,短剧类目需要接入虚拟支付.小程序中涉及游戏币,VIP等均属于虚拟支付范畴.

首先,需要在小程序后台申请开通虚拟支付,这里按小程序后台的照流程走,开通即可,本文主要讲一下代码实现:

PHP代码

//先生成一个订单
$insert_payment = [
    'uid' => $this->user_id,
    'openid' => $this->user_info['openid'],
    'pro_id' => $product_id,
    'video_id' => $video_id,
    'pay_status' => 1,
    'money' => $money,
    'coins_num' => $products[$product_id]['coins_num'],
    'coins_gift' => $products[$product_id]['coins_num'],
];

$payment = Payment::query()->create($insert_payment);
$pay_id = $payment->pay_id;

$offerId = 'xxxxxxx';//微信小程序虚拟支付页面-基本信息中找
$signData = [
    'offerId' => $offerId,
    'buyQuantity' => $products[$product_id]['coins_num'],//购买币的数量,他会自动根据兑换比例让全端支付前
    'env' => 0,//环境配置, 0 米大师正式环境, 1 米大师沙箱环境, 默认为 0
    'currencyType' => 'CNY',
    'platform' => 'android',//截止2023年10月19日18:58:01仅支持安卓虚拟支付
    'outTradeNo' => 'outTradeNo_' . $pay_id,//订单号,注意长度和格式
    'attach' => $video_id//其他参数
];

$appkey = 'xxxxxxxxxxxx';//微信小程序虚拟支付页面-基本信息中找,有两个正式和沙箱,注意跟上面签名数据中的env字段对应

//下面的requestVirtualPayment是下单拉起支付的参数,微信文档中还有很多其他参数比如:查询和创建订单接口query_data,请根据文档自行组织$signData
$need_sign_msg = 'requestVirtualPayment&' . json_encode($signData);
$pay_sing = hash_hmac('sha256', $need_sign_msg, $appkey);//生成支付签名

$need_sign = json_encode($signData);
$session_key = $this->user_info['session_key'];这个session_key是在用code换取openid接口中同openid一起返回的返回的(查阅code2Session接口)
$signature = hash_hmac('sha256', $need_sign, $session_key);//生成用户态签名

//将生成的数据发送给前端,下面三个参数是前端调起支付的必要数据
$this->pagedata['signData'] = $signData;
$this->pagedata['pay_sing'] = $pay_sing;
$this->pagedata['signature'] = $signature;


前端的代码就不贴了,主要是使用上面代码中生成的三个参数,调用

wx.requestVirtualPayment

方法拉起支付即可.


如果拉不起来,就在小程序后台虚拟支付中看看自己的道具设置 或者 人民币和虚拟币的兑换比例 设置没有设置好.


最后,服务端还需要注意,要提供一个url推送地址来接收用户支付成功的消息,就跟jsapi类似,不过不能跟jsapi支付的回调地址一样,要单独写,如果你的项目中有接收微信推送的事件的地址,则不用单独写.这个推送地址也在小程序后台开发管理-开发设置-消息推送中配置

支付成功后微信推送一个事件给你,事件的消息内容:

{
    "ToUserName":"xxxx",
    "FromUserName":"xxxxxx",
    "CreateTime":1697705319,
    "MsgType":"event",
    "Event":"xpay_coin_pay_notify",
    "OpenId":"xxxxxxx",
    "OutTradeNo":"outTradeNo_86",
    "WeChatPayInfo":{
        "MchOrderNo":"xxxxxx",
        "TransactionId":"xxxxxxxxx",
        "PaidTime":1697705318
    },
    "Env":0,
    "CoinInfo":{
        "Quantity":690,
        "OrigPrice":1,
        "ActualPrice":1,
        "Attach":""
    },
    "RetryTimes":0
}

你收到消息以后修改订单状态即可(微信还提供了另外一种方式,自己查看文档,微信说两个一起用更可靠).




如果你觉得本篇文章对您有帮助,请打赏作者

上一篇: 如何通过selenium只登录一次后续不需要经常打开浏览器就可以在web页面上继续操作?

下一篇: 18位身份证号码的校验(Python)

最新评论

暂无评论

热门文章

最新评论

网站数据

网站文章数:481

今日UV/PV/IP:12/13/12

昨日UV/PV/IP:22/28 /22

TOP