我的小程序纯粹云开发,用云数据库,没有自己的服务器。
业务需求:微信购物,支付,成功后更改商品状态(比如“待支付”变成“已支付”)。
目前用的是这个tenpay (https://blog.csdn.net/qiushi_1990/article/details/99347580),完成下单,其实tenpay背后应该是用了“统一下单API (https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)”,可以指定一个“通知地址 notify_url 参数”但是必须是我自己的服务器网址,比如http://hello-world.com/。但是我没有自己的服务器,也就意味着我无法获得用户支付成功的通知,也不能靠这个来触发回调函数(比如更改商品状态)。
客户端支付的代码是这个API: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/payment/wx.requestPayment.html。在这个客户端我可以写一个支付成功的success回调函数,比如
success(){
/* 从客户端触发云函数,更改商品状态为“已支付” */
call_cloud_function_to_change_products_to_paid_status();
}
如果这样做就意味着第一步:用户A进行了支付。第二步:用户A自己通知后台“我已经付了钱了。请发货。”由于这2步代码都在前端,那么黑客岂不是可以直接触发第二步函数,骗商家发货。理想方法应该是第一步:用户A支付。第二步:腾讯主动触发我的云函数X,通知我继续发货等。请问该怎么解决我的问题?
另外,我也注意到,如果用CloudPay.unifiedOrder() https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/open/pay/CloudPay.unifiedOrder.html 则可以指定一个云函数作为支付成功后的回调,但是它需要 sub_mch_id (子商户号)而不能用 mch_id 或 merchant_id (商户号)。目前我的情况是只有一个商户号,没有子商户号。我是否应该去弄一个子商户号?
1、qcloud.com
2、登录方式:公众号授权;选该小程序身份;
3、cloudbase,选择某云环境;
4、http接入,新建一个接入,关联你接收微信支付成功通知的云函数,拷贝该http接入的url,将notify_url设置为该接入的url
另:CloudPay.unifiedOrder里,将你的商户号直接填在sub_mch_id里,就能跑通了。(需要在云开发控制台先开通云支付功能)
建议不要再用你上面的代码方式了,完全没有必要了,CloudPay已经完全可以替换云函数里的V2支付了,除非你有特殊接口要求;
result:{errCode: 0, errMsg: "cloudPay.unifiedOrder:ok",returnCode: "FAIL", returnMsg: "受理关系不存在"}
2、不要贴别人的图,要贴你的,你的云控制台是什么样的。
基本账户信息
微信支付商户号: 1********8
商户类型: 普通商户
在https://pay.weixin.qq.com/index.php/extend/product/lists?tid=3 “产品中心” - “我的产品” - “已开通” 板块可见:JSAPI支付
这应该说明“微信支付是开通了的”,对吧?但是在微信开发工具-云开发界面-“设置”-“全局设置”,如图,底下是空的。期望是有一个“微信支付配置”板块。
另外,如原帖所说,我目前只有“商户号”,没有“子商户号”。我的代码用了老版本(v2 API),目前是可用的,微信支付也是可以在手机上正常发起,输入密码,并看到“支付成功”界面的。主要问题是关于腾讯收到钱之后给我回调通知。
我也注意到: https://blog.csdn.net/qq_18881987/article/details/94428628 提到sub_mch_id 是“特约商户号”,那我这个只有“普通商户”是不行了?
哪里出了问题?
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_sl_api.php?chapter=9_2
很有意思,这个链接也是相关话题,却不需要sub_mch_id子商户号:
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_2
这是怎么回事?
result:{errCode: 0, errMsg: "cloudPay.unifiedOrder:ok",returnCode: "FAIL", returnMsg: "受理关系不存在"}