webapi 微信prepayid_net webapi 微信 - CSDN
精华内容
参与话题
  • Android实现微信支付和踩过的深坑

    千次阅读 2017-08-24 14:58:15
    微信支付,errCode = -1 的错误,解决办法,出现微信支付成功但是未回调。

    用了2天的时间才把微信支付弄明白到底怎么回事,不容易啊。

    先听我絮叨一下微信支付的具体流程:

    1.APP用户请求web url,这个url会去“微信商户平台”统一下订单。
    2.下单以后返回一些数据,根据返回的数据,再去"微信APP"启动支付。

    这其中涉及了3个sign(也叫签名的东西)。如果不知道签名的规则请:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 查看

    第一个sign:  用户去“微信商户平台下单” 参数封装成一个xml,其中sign参数为:MD5(所有参数排序后+ key=微信商户平台的密钥)。


    第二个sign: “微信商户平台”下单后,返回的sign,用于自己平台上对于微信返回的数据做校验。千万不要拿这个sign去启动“微信APP”支付(要不然就出提示:errCode = -1 的错误)。


    第三个sign:需要把下单成功后的参数,按照特定的规则排列,这个规则就是,看下图:

    参数名和参数值都不能错,必须是这样的 。然后根据 appid,partnerid,prepayid,package,noncestr,timestamp进行签名(sign)签名的规则为:MD5(这6个参数排序后+ key=微信商户平台的密钥)。加入sign参数后,再去加入其他参数。然后你的安卓APP根据获取到的参数来启动微信支付。(否则也会出现 errCode = -1 的错误)。

    errCode -1:签名错误,所说的签名就是第三个sign。当然还有APPID未通过,和APPID注册的和返回的不一样,这个是“微信开放平台”里的东西。

    所以说,如果看到3个sign都是不一样的前往不要吃惊。

    APP代码比较简单如下:

    public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
           
            api = WXAPIFactory.createWXAPI(this, appid,false);
            api.registerApp(appid);//注册appid
            api.handleIntent(getIntent(), this);
            Pay();
        }
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
            api.handleIntent(intent, this);
        }
    
        private void Pay(){
    
            new Request().get(url, new Callback() {//发起web请求
                @Override
                public void finished(final String result) {
                    if (null != result) {
                        
                        final Map map = gson.fromJson(result, Map.class);
                        if ("SUCCESS".equalsIgnoreCase((String) map.get("return_code"))) {
                            api.registerApp((String) map.get("appid"));
                            PayReq req = new PayReq();
                            req.appId = (String) map.get("appid");
                            req.partnerId = (String) map.get("partnerid");
                            req.prepayId = (String) map.get("prepayid");
                            req.packageValue = (String) map.get("package");
                            req.nonceStr = (String) map.get("noncestr");
                            req.timeStamp = (String) map.get("timestamp");
                            req.sign = (String) map.get("sign");
                            api.sendReq(req);
                        } else {
    						Log.e("error-->", "FAIL");
                        }
                    } else {  
    					Log.e("error-->", "REQUEST FAIL");
                    }
                }
            });
        }
    
        @Override
        public void onReq(BaseReq baseReq) { }
    
        @Override
        public void onResp(BaseResp baseResp) {
            if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
                //支付成功
               
            }else{
                //支付失败
                
            }
            
        }
    }

    如果出现微信支付成功但是未回调,onResp方法,请检查包名是否正确,微信支付和微信分享的回调必须如下图:

    这种目录结构才行。同时还要修改AndroidManifest.xml文件如下图:

    请注意: android:exported="true"。还要注意代码里要有这2句如下图:


    其他的应该都有返回错误的提示信息,都好解决。

    展开全文
  • 手撕微信H5支付遇到的坑

    千次阅读 2017-12-18 13:19:11
    最近“手撕”一词很火,加上最近在做微信H5支付遇到各种坑,故以此为题,书写微信支付的坑,预祝后来同仁饶坑而行,或者早日出坑。一、准备工作 1.申请各种appid:本人项目中遇到的场景是在《app端》的《H5》中...

    最近“手撕”一词很火,加上最近在做微信H5支付遇到各种坑,故以此为题,书写微信支付的坑,预祝后来同仁饶坑而行,或者早日出坑。


    一、准备工作
    1.申请各种appid:本人项目中遇到的场景是在《app端》的《H5》中完成《公众号的微信支付》,加《》的意思是需要你注意了。所以我的appid有3个: 应用的appid即app端的,Web端的 appid即H5用的,及微信公共号用的。 重点:商户号有两个 分别对应了 微信支付商户号和微信公众号支付商户号,具体为啥这样,也许只有微信知道。

    2.绑定appid到开放平台账号下,这样就能拿到在不同appid下对应的统一唯一标识unionid。而不同appid 获取到的 openid 有不相同,所以才有了unionid。

    3.详细填写开放平台的开发配置,重点:授权回调域,api_key。应用的在开放平台,公众号的在平台。

    二、填坑经历:
    坑1:由于本人是接的之前项目,之前已经做了微信的授权登录与二次分享。所以我做支付的时候直接就用了,之前通过code换取得用户信息中的opneid。导致微信支付的统一下单失败。分析原因:是因为之前获取openid 是通过 web的appid获取的,这里应该使用公众号appid获取 openid作为统一下单接口中的openid参数。接下来的思路是原来的接口中替换appid和可以获取opnenid。
    坑2:上面通过oauth2的方法获取openid,需要在请求中传入wechat_redirect回调的地址,这个地址需要在公众平台的 授权回调域中做配置,但是该配置只能指定到域名。所以重点:本人项目中的回调必须指定到端口,所以该回调可能会出现跨域的问题。所以接下来要做的是解决跨域问题。最佳策略请百度。本人采用的方法是写死静态回调页面,获取code,再通过code换取openid.
    坑3:下单成功后,返回给前端下单成功信息,但是前端仍然无法调起微信支付。然后根据前端的返回提示修改错误,指导报签名错误。
    解决办法:a.返回前端的签名自己在微信的签名检查工具中做检查 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1。确保自己的签名无误。推荐使用微信的官方加签名的方式及xml和map的转换方法。
    b.保证 a无误的条件下,判断前端是否正确传参,前端 的返回信息务必原样提示微信端的返回信息,不要做自定义处理,方便根据返回信息调试错误。
    c.仍让签名失败。本人采取的方式是,后端加签前的key与微信H5调起支付的参数大小写一致,并重置api_key。终于迎来微信的笑脸。

    至于如何下订单,如何处理回调网上有不少例子,在此就不在列举,下单接口中报各种不匹配,那就肯定是不匹配,所以务必梳理自己公司的 appid及类型,商户号之间的正确对应的关系,并明确自己到底是使用那个appid,api_key及商户id.

    补充 ———————————————————————————————————————————
    一· 按照领导要求有做了app及H5微信外部的微信支付。结果发现:微信的支付至少有三种方式。 1.app的微信支付 2.微信的公众号H5支付。3.非微信的web浏览器支付。以上三种方式均需要调用微信的统一下单接口,其中需要的参数都大同小异常。支付成功后的回调接口基本没有区别,都是在回调中处理 自己的业务,并返回给微信回调成功响应。
    二.比较:
    1.统一下单接口中的body 字段格式需要严格按照微信要求的格式处理,对于中文的字符body,在发请求请 对字符串做处理编码处理,例:
    String strResult = HttpUtil.executePost(null,WXPayConstants.ORDER_URL, new String(orderXml.toString().getBytes(), “ISO-8859-1”));
    2.做公众号的H5支付,当trade_type=jsapi 时候 需要获取公众号对应的用户openid
    3.公众号H5支付及app支付调用统一下单接口后,需要对返回结果处理,并在此加签给前端。例如:

     String strResult = HttpUtil.executePost(null, WXPayConstants.ORDER_URL, new   String(orderXml.toString().getBytes(), "ISO-8859-1"));
                    LOG.info("wxpay/creatorder  strResult:" + strResult.toString());
                    try {
                        /**统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。
                         * 参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay**/
                        Map<String, String> map = WXPayUtil.xmlToMap(strResult);
                        SortedMap<String, String> reMap = new TreeMap<String, String>();
                        reMap.put("appid", WXPayConstants.APP_APP_ID);
                        reMap.put("partnerid", WXPayConstants.APP_MCH_ID);
                        reMap.put("prepayid", map.get("prepay_id"));
                        reMap.put("package", "Sign=WXPay");
                        reMap.put("noncestr", WXPayUtil.generateNonceStr());
                        //本来生成的时间戳是13位,但是ios必须是10位,所以截取了一下
                        reMap.put("timestamp", String.valueOf(System.currentTimeMillis()).toString().substring(0, 10));
                        reMap.put("sign", WXPayUtil.generateSignature(reMap, WXPayConstants.APP_API_KEY));

    而非微信H5浏览器支付,则不需要在此加签名,直接返回前端下单成功后返回结果中的跳转mweb_rul,前端还需要再该URL上添加 支付成功后 的redirect_url,该rediret_url需要做uriencode,确保在非腾讯浏览器正常打开。因为前端无法获取支付成功或者失败,我的处理思路是:在该地址访问订单详情接口给前端展示,订单详情接口中有标识该次支付是否成功的标识,前端因此就可以获取支付是否成功失败。(问题:若微信的回调失败或者慢,会导致该标识不准确,具体解决方案还待考虑)

    展开全文
  • Golang版本 微信支付、支付宝支付 SDK

    万次阅读 2020-09-04 00:43:36
    微信支付、支付宝支付等的Go版本SDK(持续更新维护中) 微信 统一下单 JSAPI - JSAPI支付(或小程序支付) NATIVE - Native支付 APP - app支付 MWEB - H5支付 查询订单(开发中) 关闭订单(开发中...
    Logo was Loading Faild!

    GoPay

    文档会更新,点击查看最新文档

    QQ、微信、支付宝的Golang版本SDK

    一、安装

    go get github.com/iGoogle-ink/gopay
    
    import (
        "fmt"
    
        "github.com/iGoogle-ink/gopay"
    )
    
    func main() {
        fmt.Println("GoPay Version: ", gopay.Version)
    }
    

    微信支付API

    • 统一下单:client.UnifiedOrder()
      • JSAPI - JSAPI支付(或小程序支付)
      • NATIVE - Native支付
      • APP - app支付
      • MWEB - H5支付
    • 提交付款码支付:client.Micropay()
    • 查询订单:client.QueryOrder()
    • 关闭订单:client.CloseOrder()
    • 撤销订单:client.Reverse()
    • 申请退款:client.Refund()
    • 查询退款:client.QueryRefund()
    • 下载对账单:client.DownloadBill()
    • 下载资金账单(正式):client.DownloadFundFlow()
    • 交易保障:client.Report()
    • 拉取订单评价数据(正式):client.BatchQueryComment()
    • 企业付款(正式):client.Transfer()
    • 查询企业付款(正式):client.GetTransferInfo()
    • 授权码查询OpenId(正式):client.AuthCodeToOpenId()
    • 公众号纯签约(正式):client.EntrustPublic()
    • APP纯签约-预签约接口-获取预签约ID(正式):client.EntrustAppPre()
    • H5纯签约(正式):client.EntrustH5()
    • 支付中签约(正式):client.EntrustPaying()
    • 请求单次分账(正式):client.ProfitSharing()
    • 请求多次分账(正式):client.MultiProfitSharing()
    • 查询分账结果(正式):client.ProfitSharingQuery()
    • 添加分账接收方(正式):client.ProfitSharingAddReceiver()
    • 删除分账接收方(正式):client.ProfitSharingRemoveReceiver()
    • 完结分账(正式):client.ProfitSharingFinish()
    • 分账回退(正式):client.ProfitSharingReturn()
    • 分账回退结果查询(正式):client.ProfitSharingReturnQuery()
    • 企业付款到银行卡API(正式):client.PayBank()
    • 查询企业付款到银行卡API(正式):client.QueryBank()
    • 获取RSA加密公钥API(正式):client.GetRSAPublicKey()
    • 自定义方法请求微信API接口:client.PostWeChatAPISelf()

    微信公共API

    • wechat.GetParamSign() => 获取微信支付所需参数里的Sign值(通过支付参数计算Sign值)
    • wechat.GetSanBoxParamSign() => 获取微信支付沙箱环境所需参数里的Sign值(通过支付参数计算Sign值)
    • wechat.GetMiniPaySign() => 获取微信小程序支付所需要的paySign
    • wechat.GetH5PaySign() => 获取微信内H5支付所需要的paySign
    • wechat.GetAppPaySign() => 获取APP支付所需要的paySign
    • wechat.ParseNotifyToBodyMap() => 解析微信支付异步通知的参数到BodyMap
    • wechat.ParseNotify() => 解析微信支付异步通知的参数
    • wechat.ParseRefundNotify() => 解析微信退款异步通知的参数
    • wechat.VerifySign() => 微信同步返回参数验签或异步通知参数验签
    • wechat.Code2Session() => 登录凭证校验:获取微信用户OpenId、UnionId、SessionKey
    • wechat.GetAppletAccessToken() => 获取微信小程序全局唯一后台接口调用凭据
    • wechat.GetAppletPaidUnionId() => 微信小程序用户支付完成后,获取该用户的 UnionId,无需用户授权
    • wechat.GetUserInfo() => 微信公众号:获取用户基本信息(UnionID机制)
    • wechat.GetUserInfoOpen() => 微信开放平台:获取用户个人信息(UnionID机制)
    • wechat.DecryptOpenDataToStruct() => 加密数据,解密到指定结构体
    • wechat.DecryptOpenDataToBodyMap() => 加密数据,解密到 BodyMap
    • wechat.GetOpenIdByAuthCode() => 授权码查询openid
    • wechat.GetAppLoginAccessToken() => App应用微信第三方登录,code换取access_token
    • wechat.RefreshAppLoginAccessToken() => 刷新App应用微信第三方登录后,获取的 access_token
    • wechat.DecryptRefundNotifyReqInfo() => 解密微信退款异步通知的加密数据

    QQ支付API

    • 提交付款码支付:client.MicroPay()
    • 撤销订单:client.Reverse()
    • 统一下单:client.UnifiedOrder()
    • 订单查询:client.OrderQuery()
    • 关闭订单:client.CloseOrder()
    • 申请退款:client.Refund()
    • 退款查询:client.RefundQuery()
    • 交易账单:client.StatementDown()
    • 资金账单:client.AccRoll()
    • 自定义方法请求微信API接口:client.PostQQAPISelf()

    QQ公共API

    • qq.ParseNotifyToBodyMap() => 解析QQ支付异步通知的结果到BodyMap
    • qq.ParseNotify() => 解析QQ支付异步通知的参数
    • qq.VerifySign() => QQ同步返回参数验签或异步通知参数验签

    支付宝支付API

    因支付宝接口太多,如没实现的接口,还请开发者自行调用client.PostAliPayAPISelf()方法实现!

    • 支付宝接口自行实现方法:client.PostAliPayAPISelf()
    • 手机网站支付接口2.0(手机网站支付):client.TradeWapPay()
    • 统一收单下单并支付页面接口(电脑网站支付):client.TradePagePay()
    • APP支付接口2.0(APP支付):client.TradeAppPay()
    • 统一收单交易支付接口(商家扫用户付款码):client.TradePay()
    • 统一收单交易创建接口(小程序支付):client.TradeCreate()
    • 统一收单线下交易查询:client.TradeQuery()
    • 统一收单交易关闭接口:client.TradeClose()
    • 统一收单交易撤销接口:client.TradeCancel()
    • 统一收单交易退款接口:client.TradeRefund()
    • 统一收单退款页面接口:client.TradePageRefund()
    • 统一收单交易退款查询:client.TradeFastPayRefundQuery()
    • 统一收单交易结算接口:client.TradeOrderSettle()
    • 统一收单线下交易预创建(用户扫商品收款码):client.TradePrecreate()
    • 单笔转账接口:client.FundTransUniTransfer()
    • 转账业务单据查询接口:client.FundTransCommonQuery()
    • 支付宝资金账户资产查询接口:client.FundAccountQuery()
    • 换取授权访问令牌(获取access_token,user_id等信息):client.SystemOauthToken()
    • 支付宝会员授权信息查询接口(App支付宝登录):client.UserInfoShare()
    • 换取应用授权令牌(获取app_auth_token,auth_app_id,user_id等信息):client.OpenAuthTokenApp()
    • 获取芝麻信用分:client.ZhimaCreditScoreGet()
    • 身份认证初始化服务:client.UserCertifyOpenInit()
    • 身份认证开始认证(获取认证链接):client.UserCertifyOpenCertify()
    • 身份认证记录查询:client.UserCertifyOpenQuery()
    • 用户登陆授权:client.UserInfoAuth()
    • 支付宝商家账户当前余额查询:client.DataBillBalanceQuery()
    • 查询对账单下载地址:client.DataBillDownloadUrlQuery()

    支付宝公共API

    • alipay.GetCertSN() => 获取证书SN号(app_cert_sn、alipay_cert_sn)
    • alipay.GetRootCertSN() => 获取证书SN号(alipay_root_cert_sn)
    • alipay.GetRsaSign() => 获取支付宝参数签名(参数sign值)
    • alipay.SystemOauthToken() => 换取授权访问令牌(得到access_token,user_id等信息)
    • alipay.FormatPrivateKey() => 格式化应用私钥
    • alipay.FormatPublicKey() => 格式化支付宝公钥
    • alipay.FormatURLParam() => 格式化支付宝请求URL参数
    • alipay.ParseNotifyToBodyMap() => 解析支付宝支付异步通知的参数到BodyMap
    • alipay.ParseNotifyByURLValues() => 通过 url.Values 解析支付宝支付异步通知的参数到BodyMap
    • alipay.VerifySign() => 支付宝异步通知参数验签
    • alipay.VerifySignWithCert() => 支付宝异步通知参数验签(证书方式)
    • alipay.VerifySyncSign() => 支付宝同步返回参数验签
    • alipay.DecryptOpenDataToStruct() => 解密支付宝开放数据到 结构体
    • alipay.DecryptOpenDataToBodyMap() => 解密支付宝开放数据到 BodyMap
    • alipay.MonitorHeartbeatSyn() => 验签接口

    二、文档说明

    • GoDoc
    • QQ支付 使用方法请参考微信的
    • 所有方法,如有问题,请仔细查看 wechat_client_test.go、alipay_client_test.go 或 examples
    • 有问题请加QQ群(加群验证答案:gopay),微信加好友拉群(微信群比较活跃)。在此,非常感谢那些加群后,提出意见和反馈问题的同志们!

    QQ群: 加微信拉群:


    1、初始化GoPay客户端并做配置(HTTP请求均默认设置tls.Config{InsecureSkipVerify: true})

    • 微信

    微信官方文档:官方文档

    注意:微信支付下单等操作可用沙箱环境测试是否成功,但真正支付时,请使用正式环境 isProd = true,不然会报错。

    import (
    	"github.com/iGoogle-ink/gopay/wechat"
    )
    
    // 初始化微信客户端
    //    appId:应用ID
    //    mchId:商户ID
    //    apiKey:API秘钥值
    //    isProd:是否是正式环境
    client := wechat.NewClient("wxdaa2ab9ef87b5497", mchId, apiKey, false)
    
    // 设置国家:不设置默认 中国国内
    //    wechat.China:中国国内
    //    wechat.China2:中国国内备用
    //    wechat.SoutheastAsia:东南亚
    //    wechat.Other:其他国家
    client.SetCountry(wechat.China)
    
    // 添加微信证书 Path 路径
    //    certFilePath:apiclient_cert.pem 路径
    //    keyFilePath:apiclient_key.pem 路径
    //    pkcs12FilePath:apiclient_cert.p12 路径
    //    返回err
    client.AddCertFilePath()
    
    
    • 支付宝

    支付宝官方文档:官方文档

    支付宝RSA秘钥生成文档:生成RSA密钥 (推荐使用 RSA2)

    沙箱环境使用说明:文档地址

    import (
    	"github.com/iGoogle-ink/gopay/alipay"
    )
    
    // 初始化支付宝客户端
    //    appId:应用ID
    //    privateKey:应用私钥,支持PKCS1和PKCS8
    //    isProd:是否是正式环境
    client := alipay.NewClient("2016091200494382", privateKey, false)
    
    // 设置支付宝请求 公共参数
    //    注意:具体设置哪些参数,根据不同的方法而不同,此处列举出所有设置参数
    client.SetLocation().                       // 设置时区,不设置或出错均为默认服务器时间
        SetPrivateKeyType().                    // 设置 支付宝 私钥类型,alipay.PKCS1 或 alipay.PKCS8,默认 PKCS1
        SetAliPayRootCertSN().                  // 设置支付宝根证书SN,通过 alipay.GetRootCertSN() 获取
        SetAppCertSN().                         // 设置应用公钥证书SN,通过 alipay.GetCertSN() 获取
        SetAliPayPublicCertSN().                // 设置支付宝公钥证书SN,通过 alipay.GetCertSN() 获取
        SetCharset("utf-8").                    // 设置字符编码,不设置默认 utf-8
        SetSignType(alipay.RSA2).               // 设置签名类型,不设置默认 RSA2
        SetReturnUrl("https://www.gopay.ink").  // 设置返回URL
        SetNotifyUrl("https://www.gopay.ink").  // 设置异步通知URL
        SetAppAuthToken().                      // 设置第三方应用授权
        SetAuthToken()                          // 设置个人信息授权
    
    err := client.SetCertSnByPath("appCertPublicKey.crt", "alipayRootCert.crt", "alipayCertPublicKey_RSA2.crt")
    

    2、初始化并赋值BodyMap(client的方法所需的入参)

    • 微信请求参数

    具体参数请根据不同接口查看:微信支付接口文档

    import (
    	"github.com/iGoogle-ink/gopay/wechat"
    )
    
    // 初始化 BodyMap
    bm := make(gopay.BodyMap)
    bm.Set("nonce_str", gotil.GetRandomString(32))
    bm.Set("body", "小程序测试支付")
    bm.Set("out_trade_no", number)
    bm.Set("total_fee", 1)
    bm.Set("spbill_create_ip", "127.0.0.1")
    bm.Set("notify_url", "http://www.gopay.ink")
    bm.Set("trade_type", wechat.TradeType_Mini)
    bm.Set("device_info", "WEB")
    bm.Set("sign_type", wechat.SignType_MD5)
    bm.Set("openid", "o0Df70H2Q0fY8JXh1aFPIRyOBgu8")
    
    // 嵌套json格式数据(例如:H5支付的 scene_info 参数)
    h5Info := make(map[string]string)
    h5Info["type"] = "Wap"
    h5Info["wap_url"] = "http://www.gopay.ink"
    h5Info["wap_name"] = "H5测试支付"
    
    sceneInfo := make(map[string]map[string]string)
    sceneInfo["h5_info"] = h5Info
    
    bm.Set("scene_info", sceneInfo)
    
    // 参数 sign ,可单独生成赋值到BodyMap中;也可不传sign参数,client内部会自动获取
    // 如需单独赋值 sign 参数,需通过下面方法,最后获取sign值并在最后赋值此参数
    sign := wechat.GetParamSign("wxdaa2ab9ef87b5497", mchId, apiKey, body)
    // sign, _ := wechat.GetSanBoxParamSign("wxdaa2ab9ef87b5497", mchId, apiKey, body)
    bm.Set("sign", sign)
    
    • 支付宝请求参数

    具体参数请根据不同接口查看:支付宝支付API接口文档

    // 初始化 BodyMap
    bm := make(gopay.BodyMap)
    bm.Set("subject", "手机网站测试支付")
    bm.Set("out_trade_no", "GZ201901301040355703")
    bm.Set("quit_url", "https://www.gopay.ink")
    bm.Set("total_amount", "100.00")
    bm.Set("product_code", "QUICK_WAP_WAY")
    

    3、client 方法调用

    • 微信 client

    wxRsp, err := client.UnifiedOrder(bm)
    wxRsp, err := client.Micropay(bm)
    wxRsp, err := client.QueryOrder(bm)
    wxRsp, err := client.CloseOrder(bm)
    wxRsp, err := client.Reverse(bm, "apiclient_cert.pem", "apiclient_key.pem", "apiclient_cert.p12")
    wxRsp, err := client.Refund(bm, "apiclient_cert.pem", "apiclient_key.pem", "apiclient_cert.p12")
    wxRsp, err := client.QueryRefund(bm)
    wxRsp, err := client.DownloadBill(bm)
    wxRsp, err := client.DownloadFundFlow(bm, "apiclient_cert.pem", "apiclient_key.pem", "apiclient_cert.p12")
    wxRsp, err := client.BatchQueryComment(bm, "apiclient_cert.pem", "apiclient_key.pem", "apiclient_cert.p12")
    wxRsp, err := client.Transfer(bm, "apiclient_cert.pem", "apiclient_key.pem", "apiclient_cert.p12")
    
    • 支付宝 client

    // 手机网站支付是通过服务端获取支付URL后,然后返回给客户端,请求URL地址即可打开支付页面
    payUrl, err := client.TradeWapPay(bm)
    
    // 电脑网站支付是通过服务端获取支付URL后,然后返回给客户端,请求URL地址即可打开支付页面
    payUrl, err := client.TradePagePay(bm)
    
    // APP支付是通过服务端获取支付参数后,然后通过Android/iOS客户端的SDK调用支付功能
    payParam, err := client.TradeAppPay(bm)
    
    // 商家使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款
    aliRsp, err := client.TradePay(bm)
    
    // 支付宝小程序支付时 buyer_id 为必传参数,需要提前获取,获取方法如下两种
    //    1、alipay.SystemOauthToken()     返回取值:rsp.SystemOauthTokenResponse.UserId
    //    2、client.SystemOauthToken()    返回取值:aliRsp.SystemOauthTokenResponse.UserId
    aliRsp, err := client.TradeCreate(bm)
    aliRsp, err := client.TradeQuery(bm)
    aliRsp, err := client.TradeClose(bm)
    aliRsp, err := client.TradeCancel(bm)
    aliRsp, err := client.TradeRefund(bm)
    aliRsp, err := client.TradePageRefund(bm)
    aliRsp, err := client.TradeFastPayRefundQuery(bm)
    aliRsp, err := client.TradeOrderSettle(bm)
    aliRsp, err := client.TradePrecreate(bm)
    aliRsp, err := client.FundTransUniTransfer(bm)
    aliRsp, err := client.FundTransCommonQuery(bm)
    aliRsp, err := client.FundAccountQuery(bm)
    aliRsp, err := client.SystemOauthToken(bm)
    aliRsp, err := client.OpenAuthTokenApp(bm)
    aliRsp, err := client.ZhimaCreditScoreGet(bm)
    aliRsp, err := client.UserCertifyOpenInit(bm)
    aliRsp, err := client.UserCertifyOpenCertify(bm)
    aliRsp, err := client.UserCertifyOpenQuery(bm)
    

    4、微信统一下单后,获取微信小程序支付、APP支付、微信内H5支付所需要的 paySign

    • 微信(只有微信需要此操作)

    微信小程序支付官方文档:微信小程序支付API

    APP支付官方文档:APP端调起支付的参数列表文档

    微信内H5支付官方文档:微信内H5支付文档

    import (
    	"github.com/iGoogle-ink/gopay/wechat"
    )
    
    // ====微信小程序 paySign====
    timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
    prepayId := "prepay_id=" + wxRsp.PrepayId   // 此处的 wxRsp.PrepayId ,统一下单成功后得到
    // 获取微信小程序支付的 paySign
    //    appId:AppID
    //    nonceStr:随机字符串
    //    prepayId:统一下单成功后得到的值
    //    signType:签名方式,务必与统一下单时用的签名方式一致
    //    timeStamp:时间
    //    apiKey:API秘钥值
    paySign := wechat.GetMiniPaySign(AppID, wxRsp.NonceStr, prepayId, wechat.SignType_MD5, timeStamp, apiKey)
    
    // ====APP支付 paySign====
    timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
    // 获取APP支付的 paySign
    // 注意:package 参数因为是固定值,无需开发者再传入
    //    appId:AppID
    //    partnerid:partnerid
    //    nonceStr:随机字符串
    //    prepayId:统一下单成功后得到的值
    //    signType:签名方式,务必与统一下单时用的签名方式一致
    //    timeStamp:时间
    //    apiKey:API秘钥值
    paySign := wechat.GetAppPaySign(appid, partnerid, wxRsp.NonceStr, wxRsp.PrepayId, wechat.SignType_MD5, timeStamp, apiKey)
    
    // ====微信内H5支付 paySign====
    timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
    packages := "prepay_id=" + wxRsp.PrepayId   // 此处的 wxRsp.PrepayId ,统一下单成功后得到
    // 获取微信内H5支付 paySign
    //    appId:AppID
    //    nonceStr:随机字符串
    //    packages:统一下单成功后拼接得到的值
    //    signType:签名方式,务必与统一下单时用的签名方式一致
    //    timeStamp:时间
    //    apiKey:API秘钥值
    paySign := wechat.GetH5PaySign(AppID, wxRsp.NonceStr, packages, wechat.SignType_MD5, timeStamp, apiKey)
    

    5、同步返回参数验签Sign、异步通知参数解析和验签Sign、异步通知返回

    异步参数需要先解析,解析出来的结构体或BodyMap再验签

    Gin Web框架

    Echo Web框架

    异步通知处理完后,需回复平台固定数据

    • 微信

    import (
    	"github.com/iGoogle-ink/gopay"
    	"github.com/iGoogle-ink/gopay/wechat"
    )
    
    // ====同步返回参数验签Sign====
    wxRsp, err := client.UnifiedOrder(bm)
    // 微信同步返回参数验签或异步通知参数验签
    //    apiKey:API秘钥值
    //    signType:签名类型(调用API方法时填写的类型)
    //    bean:微信同步返回的结构体 wxRsp 或 异步通知解析的结构体 notifyReq
    //    返回参数 ok:是否验签通过
    //    返回参数 err:错误信息
    ok, err := wechat.VerifySign(apiKey, wechat.SignType_MD5, wxRsp)
    
    // ====支付异步通知参数解析和验签Sign====
    // 解析支付异步通知的参数
    //    req:*http.Request
    //    ctx.Request   是 gin 框架的获取 *http.Request
    //    ctx.Request() 是 echo 框架的获取 *http.Request
    //    返回参数 notifyReq:通知的参数
    //    返回参数 err:错误信息
    notifyReq, err := wechat.ParseNotifyToBodyMap(ctx.Request)
    
    // 验签操作
    ok, err := wechat.VerifySign(apiKey, wechat.SignType_MD5, notifyReq)
    
    // ====退款异步通知参数解析,退款通知无sign,不用验签====
    // 
    // 解析退款异步通知的参数,解析出来的 req_info 是加密数据,需解密
    //    req:*http.Request
    //    ctx.Request   是 gin 框架的获取 *http.Request
    //    ctx.Request() 是 echo 框架的获取 *http.Request
    //    返回参数 notifyReq:通知的参数
    //    返回参数 err:错误信息
    notifyReq, err := wechat.ParseNotifyToBodyMap(c.Request)
     或
    notifyReq, err := wechat.ParseRefundNotify(c.Request)
    
    // ==解密退款异步通知的加密参数 req_info ==
    refundNotify, err := wechat.DecryptRefundNotifyReqInfo(notifyReq.ReqInfo, apiKey)
    
    // ==异步通知,返回给微信平台的信息==
    rsp := new(wechat.NotifyResponse) // 回复微信的数据
    rsp.ReturnCode = gopay.SUCCESS
    rsp.ReturnMsg = gopay.OK
    
    return c.String(http.StatusOK, rsp.ToXmlString())   // 此写法是 echo 框架返回微信的写法
    c.String(http.StatusOK, "%s", rsp.ToXmlString())    // 此写法是 gin 框架返回微信的写法
    
    • 支付宝

    注意:APP支付、手机网站支付、电脑网站支付 暂不支持同步返回验签

    支付宝支付后的同步/异步通知验签文档:支付结果通知

    import (
    	"github.com/iGoogle-ink/gopay/alipay"
    )
    
    // ====同步返回参数验签Sign====
    aliRsp, err := client.TradePay(bm)
    // 支付宝同步返回验签
    //    注意:APP支付,手机网站支付,电脑网站支付 暂不支持同步返回验签
    //    aliPayPublicKey:支付宝公钥
    //    signData:待验签参数,aliRsp.SignData
    //    sign:待验签sign,aliRsp.Sign
    //    返回参数ok:是否验签通过
    //    返回参数err:错误信息
    ok, err := alipay.VerifySyncSign(aliPayPublicKey, aliRsp.SignData, aliRsp.Sign)
    
    // ====异步通知参数解析和验签Sign====
    // 解析异步通知的参数
    //    req:*http.Request
    //    返回参数 notifyReq:通知的参数
    //    返回参数 err:错误信息
    notifyReq, err = alipay.ParseNotifyToBodyMap(c.Request())     // c.Request()是 echo 框架的获取
     或
    notifyReq, err = alipay.ParseNotifyByURLValues()
    
    // 验签操作
    ok, err = alipay.VerifySign(aliPayPublicKey, notifyReq)
    // 证书验签操作
    ok, err = alipay.VerifySignWithCert("alipayCertPublicKey_RSA2.crt", aliPayPublicKey, notifyReq)
    
    // ==异步通知,返回支付宝平台的信息==
    //    文档:https://opendocs.alipay.com/open/203/105286
    //    程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h)
    return c.String(http.StatusOK, "success")   // 此写法是 echo 框架返回支付宝的写法
    c.String(http.StatusOK, "%s", "success")    // 此写法是 gin 框架返回支付宝的写法
    

    6、微信、支付宝 公共API(仅部分说明)

    • 微信 公共API

    官方文档:code2Session

    button按钮获取手机号码:button组件文档

    微信解密算法文档:解密算法文档

    import (
    	"github.com/iGoogle-ink/gopay/wechat"
    )
    
    // 获取微信小程序用户的OpenId、SessionKey、UnionId
    //    appId:微信小程序的APPID
    //    appSecret:微信小程序的AppSecret
    //    wxCode:小程序调用wx.login 获取的code
    sessionRsp, err := wechat.Code2Session(appId, appSecret, wxCode)
    
    // ====解密微信加密数据到指定结构体====
    
    //小程序获取手机号
    data := "Kf3TdPbzEmhWMuPKtlKxIWDkijhn402w1bxoHL4kLdcKr6jT1jNcIhvDJfjXmJcgDWLjmBiIGJ5acUuSvxLws3WgAkERmtTuiCG10CKLsJiR+AXVk7B2TUQzsq88YVilDz/YAN3647REE7glGmeBPfvUmdbfDzhL9BzvEiuRhABuCYyTMz4iaM8hFjbLB1caaeoOlykYAFMWC5pZi9P8uw=="
    iv := "Cds8j3VYoGvnTp1BrjXdJg=="
    session := "lyY4HPQbaOYzZdG+JcYK9w=="
    phone := new(wechat.UserPhone)
    // 解密开放数据
    //    encryptedData:包括敏感数据在内的完整用户信息的加密数据,小程序获取到
    //    iv:加密算法的初始向量,小程序获取到
    //    sessionKey:会话密钥,通过 wechat.Code2Session() 方法获取到
    //    beanPtr:需要解析到的结构体指针,操作完后,声明的结构体会被赋值
    err := wechat.DecryptOpenDataToStruct(data, iv, session, phone)
    fmt.Println(*phone)
    // 获取微信小程序用户信息
    sessionKey := "tiihtNczf5v6AKRyjwEUhQ=="
    encryptedData := "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew=="
    iv2 := "r7BXXKkLb8qrSNn05n0qiA=="
    
    // 微信小程序 用户信息
    userInfo := new(wechat.AppletUserInfo)
    err = wechat.DecryptOpenDataToStruct(encryptedData, iv2, sessionKey, userInfo)
    fmt.Println(*userInfo)
    
    data := "Kf3TdPbzEmhWMuPKtlKxIWDkijhn402w1bxoHL4kLdcKr6jT1jNcIhvDJfjXmJcgDWLjmBiIGJ5acUuSvxLws3WgAkERmtTuiCG10CKLsJiR+AXVk7B2TUQzsq88YVilDz/YAN3647REE7glGmeBPfvUmdbfDzhL9BzvEiuRhABuCYyTMz4iaM8hFjbLB1caaeoOlykYAFMWC5pZi9P8uw=="
    iv := "Cds8j3VYoGvnTp1BrjXdJg=="
    session := "lyY4HPQbaOYzZdG+JcYK9w=="
        
    // 解密开放数据到 BodyMap
    //    encryptedData:包括敏感数据在内的完整用户信息的加密数据
    //    iv:加密算法的初始向量
    //    sessionKey:会话密钥
    bm, err := wechat.DecryptOpenDataToBodyMap(data, iv, session)
    if err != nil {
         fmt.Println("err:", err)
         return
    }
    fmt.Println("WeChatUserPhone:", bm)
    
    • 支付宝 公共API

    支付宝换取授权访问令牌文档:换取授权访问令牌

    获取用户手机号文档:获取用户手机号

    支付宝加解密文档:AES配置文档AES加解密文档

    import (
    	"github.com/iGoogle-ink/gopay/alipay"
    )
    
    // 换取授权访问令牌(默认使用utf-8,RSA2)
    //    appId:应用ID
    //    privateKey:应用私钥,支持PKCS1和PKCS8
    //    grantType:值为 authorization_code 时,代表用code换取;值为 refresh_token 时,代表用refresh_token换取,传空默认code换取
    //    codeOrToken:支付宝授权码或refresh_token
    rsp, err := alipay.SystemOauthToken(appId, privateKey, grantType, codeOrToken)
    
    // 解密支付宝开放数据带到指定结构体
    //    以小程序获取手机号为例
    phone := new(alipay.UserPhone)
    // 解密支付宝开放数据
    //    encryptedData:包括敏感数据在内的完整用户信息的加密数据
    //    secretKey:AES密钥,支付宝管理平台配置
    //    beanPtr:需要解析到的结构体指针
    err := alipay.DecryptOpenDataToStruct(encryptedData, secretKey, phone)
    fmt.Println(*phone)
    

    至此:

    如果您觉得本文对您有所帮助,请移步 Github 给作者一颗小星星吧

    开源不易,讲究的朋友可以给个赞赏

    微信: 支付宝:

    展开全文
  • 微信支付--预支付(统一下单)

    千次阅读 2017-08-30 14:22:48
    微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_11.按照微信官方文档统一下单接口的描述,将请求参数放入Mapprotected Map, Object> processPost(HttpServletRequest request, ...

    微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1

    1.按照微信官方文档统一下单接口的描述,将请求参数放入Map

    protected Map<String, Object>  processPost(HttpServletRequest request, HttpServletResponse response) throws BaseException {
    
            String attach = ConvertUtil.getTrimStringFromRequestParam(request, "attach", "");
            String device_info = ConvertUtil.getTrimStringFromRequestParam(request, "device_info", WXPayConstants.DEVICE_INFO_DEFAULT.WEB.toString());
            String body = ConvertUtil.getNonEmptyStringFromRequestParam(request, "body");
            String detail = ConvertUtil.getTrimStringFromRequestParam(request, "detail", "");
            String out_trade_no = ConvertUtil.getNonEmptyStringFromRequestParam(request, "out_trade_no");
            String total_fee = ConvertUtil.getNonEmptyStringFromRequestParam(request, "total_fee");
            String trade_type = ConvertUtil.getTrimStringFromRequestParam(request, "trade_type", WXPayConstants.TRADE_TYPE.JSAPI.toString());
            String product_id = ConvertUtil.getNonEmptyStringFromRequestParam(request, "product_id");
            String openid = ConvertUtil.getNonEmptyStringFromRequestParam(request, "openid");
    
            Map<String, Object> parametersMap = CommonUtils.createMap("appid", WXPayConstants.APP_ID);//appid
            CommonUtils.generateMap(parametersMap, "attach", attach);//附加数据
            CommonUtils.generateMap(parametersMap, "mch_id", WXPayConstants.PAY_STORE_ID);//商户号
            CommonUtils.generateMap(parametersMap, "device_info", device_info);//设备号 自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传"WEB"
            CommonUtils.generateMap(parametersMap, "nonce_str", WXPayUtil.generateNonceStr());
            CommonUtils.generateMap(parametersMap, "sign_type", WXPayConstants.SignType.MD5);
            CommonUtils.generateMap(parametersMap, "body", body);//商品描述
            CommonUtils.generateMap(parametersMap, "detail", detail);//商品详情
            CommonUtils.generateMap(parametersMap, "out_trade_no", out_trade_no);//自己系统的订单号
            CommonUtils.generateMap(parametersMap, "fee_type", WXPayConstants.FEE_TYPE.CNY);
            CommonUtils.generateMap(parametersMap, "total_fee", total_fee);//单位位分
            CommonUtils.generateMap(parametersMap, "spbill_create_ip", CommonUtils.getIpAddr(request));
            CommonUtils.generateMap(parametersMap, "notify_url", WXPayConstants.NOTIFY_URL);
            CommonUtils.generateMap(parametersMap, "trade_type", trade_type);
            CommonUtils.generateMap(parametersMap, "product_id", product_id);//商品id
            CommonUtils.generateMap(parametersMap, "openid", openid);//open id
    
            return WechatService.prepayId(parametersMap);
        }

    2.用微信自带的工具类对map进行加密并获取签名

    /**
         * 统一支付(获取预支付id)
         * @param
         * @return
         * @author lichenyi
         * @date 2017-8-25 0025 10:44
         */
        public static Map<String, Object>  prepayId(Map<String, Object> parametersMap) throws HttpRequestFailedException, MD5Exception {
    
            String resultString = null;
            try {
                String parameterXML = WXPayUtil.generateSignedXml(parametersMap);
                //wechat origin code
                WXPayRequest wxPayRequest = new WXPayRequest(new WXPayConfigBean());
                resultString = wxPayRequest.requestWithoutCert(WXPayConstants.UNIFIEDORDER_URL_SUFFIX, WXPayUtil.generateNonceStr(), parameterXML, false);
                logger.info("【预支付订单信息】 --> "+WXPayUtil.xmlToMap(resultString));
                return WXPayUtil.xmlToMap(resultString);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

    写的粗糙,有疑问,可以留言。

    如果觉得文章真心好, 请打赏下我吧http://blog.csdn.net/assassinsshadow/article/details/76086401

    展开全文
  • C#+Hybrid App(Android)实现微信APP支付

    千次阅读 2016-02-18 23:11:25
    之前一直在做Hybrid App(也就是用Android或者IOS的WebView控件嵌入你的H5应用,看起来跟原生应用一样),支付这块有用到第三方的WAP支付,效果还行,就是微信这块收款不能直接跟客户的账户对接,因为WebView允许H5...
  • 微信商户开发文档之扫码支付

    千次阅读 2016-01-14 19:40:14
    微信文档:https://pay.weixin.qq.com/wiki/doc/api/native.php   第一步 在微信服务号设置native支付回调url。该URL会在微信用户扫描是调用。   第二步生成微信扫描支付二维码对应的URL。 生成该URL后,就可以...
  • 微信支付(.NET版)

    千次阅读 2018-11-11 10:18:37
    前段时间做了网页版微信支付,遇到很多问题,不过最终还是解决了,现在在这里记录下开发流程以及说明,给其他人一些参考。 一、准备工作  首先肯定得先要开通微信支付功能,之前开通微信支付需要三万的押金的,...
  • ios支付为内购和第三方支付微信,支付宝,银联 一微信支付 相关链接 微信开放平台 https://open.weixin.qq.com 微信支付商户平台 ...微信支付文档 ...
  • 微信支付开发流程

    千次阅读 2018-01-02 20:19:58
     公司最近要做微信支付的功能,看了网上的许多的博客,说的不是很具体,这里总结下,以比较具体的方式总结下微信支付开发流程,总的来说分为两个过程,第一个是 生成微信JSSDK的签名,这个过程是用来拉起微信支付...
  • 微信支付开发流程及注意事项

    千次阅读 2019-07-30 08:54:47
    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!...扫码支付扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫...
  • 微信公众号支付开发-JAVA版DEMO

    万次阅读 2019-08-12 23:08:04
    首先登录微信公众平台,获取并配置以下微信开发配置: 开发者ID【AppID和AppSecret】 服务器配置 1.url服务器地址设置 2.Token【自己设置,必须英文或数字】 3.EncodingAESKey[自己随机生成,用于消息加解密] ...
  • 读者要求:已经学过微信小程序的入门官方教程,即其简易教程。 本文介绍了服务器端环境的搭建,以及微信登录+支付的程序示例,以及在实战中遇到的问题与解决方法。
  • 最近几天在做app的微信支付和支付宝支付,主要负责服务器接口。记录一下服务器这边的工作。 参考微信的官方文档链接:(有用的几个) 1 - 首先,如果想让app可以使用微信支付,必须先申请一个开放平台的...
  • 注本教程不对微信支付申请,移动开发配置做解释。技术支持QQ:806693619 最近开发手机app需要实现移动支付功能,由于考虑支付安全将微信支付生成签名写到了服务器端,官网给的demo是在客户端的,纠结了几天终于...
  • 最近项目使用uni-app实现微信支付,把过程简单记录下,帮助那些刚刚基础uni-app,苦于文档的同学们。 整体来说实现过程和非uni-app的实现方式没有太大不同,难点就在于uni-app对于orderInfo的格式没有说明。 准备...
  • 微信JSAPI支付

    万次阅读 2018-03-22 17:52:11
    1、微信支付的流程如下三张手机截图,我们在微信...金额等),将其组装成符合微信要求格式的xml,然后调用微信的“统一下单接口”调用成功后微信会返回一个组装好的xml,我们提取之中的消息(预支付id也在其中)以J...
  • java微信app支付-统一下单

    万次阅读 热门讨论 2016-03-18 18:54:59
    估计大多数人和我一样吧,每次要使用腾讯的开发api,都有一种想上吊的感觉,尤其是微信支付和支付宝对比起来文档确实差距还是有点大的 关于微信支付的申请我就不多说了,网上有很多,我们直接来说一下微信支付 微信...
  • 微信统一下单接口提交订单获得PrepayID 在JS页面中向用户发起支付请求 用户输入支付密码完成支付 使用weixin-java-tools工具可以快速完成以下开发 1.生成Oauth2.0授权链接 为什么要生成授权链接:当要为某用户...
  • s qqpay="mqqapi://forward/url?url_prefix=aHR0cHM6Ly9tcXEudGVucGF5LmNvbS92Mi9oeWJyaWQvd3d3L21vYmlsZV9xcS9wYXltZW50L2luZGV4LnNodG1sP193dj0xMDI3JmZyb209MTMmX3ZhY2Y9cXc=&...src_type=web...
  • ##目录 1. 开始前准备 1.1 注册[微信开放平台](https://open.weixin.qq.com/) 2. 理清业务流程 3. 开始集成 3.1 [下载SDK和官方实例]...
1 2 3 4 5 ... 20
收藏数 441
精华内容 176
关键字:

webapi 微信prepayid