澳门新萄京:支出宝当面付之扫码支付,java支付
分类:服务器

在PB实现支付宝当面付的效能,须求先在支付宝举办厂家签订协议,并安装相关的公钥信息。

在PB完结支付宝当面付的成效,须要先在支付宝进行商行签约,并安装相关的公钥消息(具体参照他事他说加以考查支付宝文书档案)。

立异日志

  • 2017-11-3 新增ASP.NET Core 中间件

  • 2017-10-30 修复在Linux上无法使用的BUG

首先次接触支付宝支出的开采,差不离花了半天的 时间才掌握到原本笔者供给支出的是即时到账效用.因为支付宝内部也有和微信大同小异的得到二个付出的二维码,叫做当面支付,从前一向感觉自身要做这几个,不过公司根本就没报名这一个.

下一场使用相应的私钥文件对参数进奥迪Q3SAWithSha1前面总结。具体代码如下:

接下来利用相应的私钥文件对参数进大切诺基SAWithSha1后边总结。具体代码如下:

前言

自打微软更动了COO今后,微软的攻略性取向有了异常的大的转移,不再是那么密闭,开源了过多东西,拥抱开源社区,.NET达成跨平台,收购xamarin并免费提要求开荒者等等。作者自个儿是很向往.net的,并希望.net core能够鼓起。笔者是从.net core 1.1的时候起先运用的,到明天的.net core 2.0。.net core 2.0比1.1有了一些更换,api也扩张了累累,用着更顺手了,方今在做asp.net core 对接支付宝,百度了意气风发晃没找到关于core的支付宝支出有关资料,所以便自个儿研商了蓬蓬勃勃晃,把合法的劳务端sdk修正成.net standard 2.0的() ,而且依据官方的Demo成功做出了asp.net core 2.0的PC网址支付德姆o,前边写了篇小说介绍了生龙活虎晃:ASP.NET Core 2.0 使用支付宝PC网站支付,我们能够看意气风发看。前几天讲的是开拓宝当面付中的扫码支付。

简言之介绍一下,支付宝支付总结分为:即时到账,手提式有线电话机网址开辟,app支付,当面付这种种支付方式,即时到账的流水生产线就是先签订左券,然后依照文书档案里面介绍的收获pid,配置密钥,密钥需求自个儿下载支付宝提供的三个工具在地头生成OdysseySA公钥和私钥,然后上传公钥,接着获取支付宝的TucsonSA公钥.

string ls_pubFileName,ls_priFileNamen_pbfunc_cryp lnv_crypls_priFileName ="D:pbfunclib_pri.pem"//私钥文件string ls_strstring ls_appId,ls_secret,ls_biz_contentls_appId ="3434343"//改成你的appidls_biz_content='{"out_trade_no": "2015020011","scene": "bar_code","auth_code": "' sle_1.Text '","subject": "当面付条码支付","total_amount": "0.01"}'ls_str ="app_提示","签名成功:" ls_sigStr)Else MessageBoxend if/*验证签名可以不需要调用*/ls_pubFileName ="D:pbfunclib_pub.pem"//在D盘生成公钥文件pbfunclib_pub.pemIF Not lnv_cryp.of_RSAVerifyFileSHA1(ls_pubFileName,utf8R,ls_sigStr,lnv_cryp.HASH_RESULT_DEFAULT) Then MessageBoxelse messageboxEnd IF//ls_str  =''n_pbfunc_http lnv_httplnv_http.of_clear()//清空参数string ls_datals_data = "app_&biz_content=" wf_alipay_urlencodels_data  = "&charset=" wf_alipay_urlencodels_data  = "&method=" wf_alipay_urlencodels_data  = "&sign_type=" wf_alipay_urlencodels_data  = "&sign=" wf_alipay_urlencodels_data  = "&timestamp=" wf_alipay_urlencode("2016-05-08 11:27:15")ls_data  = "&version=" wf_alipay_urlencodelnv_http.of_set_URL("https://openapi.alipay.com/gateway.do?" ls_data)Blob lblb_datastring ls_errorIF lnv_http.of_post Then string gbkData gbkData = lnv_cryp.of_utf8ToGbk//由于返回来的是utf-8编码,直接显示会乱码 MessageBox("提示",gbkData " " stringElse MessageBoxEnd IF
string ls_pubFileName,ls_priFileName
n_pbfunc_cryp lnv_cryp
ls_priFileName ="D:pbfunclib_pri.pem"//私钥文件
string ls_str

string ls_appId,ls_secret,ls_biz_content
ls_appId ="3434343"//改成你的appid
ls_biz_content='{"out_trade_no": "2015020011","scene": "bar_code","auth_code": "' sle_1.Text '","subject": "当面付条码支付","total_amount": "0.01"}'

ls_str ="app_id=" ls_appId
ls_str  ='&biz_content=' ls_biz_content
ls_str  ='&charset=utf-8'
ls_str  ='&method=alipay.trade.pay'
ls_str  ='&sign_type=RSA'
ls_str  ='&timestamp=2016-05-08 11:27:15'
ls_str  ='&version=1.0'
string ls_sigStr
blob utf8R
utf8R =lnv_cryp.of_str2utf8(ls_str)
if lnv_cryp.of_sha1withRsa(ls_priFileName,utf8R,lnv_cryp.HASH_RESULT_DEFAULT,ls_sigStr) then
    MessageBox("提示","签名成功:" ls_sigStr)
Else
    MessageBox("提示","签名失败")
end if

/*验证签名可以不需要调用*/
ls_pubFileName ="D:pbfunclib_pub.pem"//在D盘生成公钥文件pbfunclib_pub.pem
IF Not lnv_cryp.of_RSAVerifyFileSHA1(ls_pubFileName,utf8R,ls_sigStr,lnv_cryp.HASH_RESULT_DEFAULT) Then
    MessageBox("提示","验证签名失败")
else
    messagebox("","验证签名成功")
End IF
//ls_str  =''
n_pbfunc_http lnv_http
lnv_http.of_clear()//清空参数
string ls_data
ls_data  = "app_id=" wf_alipay_urlencode(ls_appId)
ls_data  = "&biz_content=" wf_alipay_urlencode(ls_biz_content)
ls_data  = "&charset=" wf_alipay_urlencode("utf-8")
ls_data  = "&method=" wf_alipay_urlencode("alipay.trade.pay")
ls_data  = "&sign_type=" wf_alipay_urlencode("RSA")
ls_data  = "&sign=" wf_alipay_urlencode(ls_sigStr)
ls_data  = "&timestamp=" wf_alipay_urlencode("2016-05-08 11:27:15")
ls_data  = "&version=" wf_alipay_urlencode("1.0")
lnv_http.of_set_URL("https://openapi.alipay.com/gateway.do?" ls_data)
Blob lblb_data
string ls_error
IF lnv_http.of_post(lblb_data,ls_error) Then
    string gbkData
    gbkData = lnv_cryp.of_utf8ToGbk(lblb_data)//由于返回来的是utf-8编码,直接显示会乱码
    MessageBox("提示",gbkData " " string(lblb_data))
Else
    MessageBox("提示","执行失败")
End IF

扫码支付简介

扫码支付是开拓宝当面付中的生机勃勃种支付情势,当面付蕴涵条码支付、扫码支付、声波支付。

扫码支付,指客户打花费付宝卡包中的“扫一扫”功能,扫描公司体现在某收银场景下的二维码并张开付出的格局。该形式适用于线下体验店支付、直面面支付等景色。

行使示例:

1.某直播平台充值

澳门新萄京 1

2.某摄像网址开通vip

澳门新萄京 2

扫码支付比守旧的跳转网页支付方便飞速。

业务流程:

澳门新萄京 3

选取手续:

  1. 收银员在商家收银河系统操作生成支付宝订单,并生成二维码;
  2. 顾客登陆支付宝钱包,点击首页“付款-扫码付”或直接点击“扫一扫”,踏向扫一扫分界面;
  3. 客商扫收银员提供的二维码,核查金额,确认支付;
  4. 顾客付款后集团收银河系统会获得支付成功还是失利的结果。

详见介绍请查阅官方文档:

接下去就是下载文书档案里面提供的demo了.那些demo基本上能够满意平常的作用开采了.

其中wf_alipay_urlencode函数代码如下:

  其中wf_alipay_urlencode函数代码如下:

配置

创办三个ASP.NET Core 2.0 MVC 项目

澳门新萄京 4

新建三个配置类Config

public class Config
{
    // 应用ID,您的APPID
    public static string AppId = "";

    /// <summary>
    /// 合作商户uid
    /// </summary>
    public static string Uid = "";

    // 支付宝网关
    public static string Gatewayurl = "https://openapi.alipaydev.com/gateway.do";

    // 商户私钥,您的原始格式RSA私钥
    public static string PrivateKey = "";

    // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public static string AlipayPublicKey = "";

    // 签名方式
    public static string SignType = "RSA2";

    // 编码格式
    public static string CharSet = "UTF-8";
}

以下演示均是接纳的支付宝沙箱情形,支付宝沙箱碰到指的相助开荒者举办接口成效开垦及主要成效联调的帮忙碰着。沙箱情形模拟了开放平台部分成品的基本点成效和重点逻辑,在开采者应用上线调查前,开荒者能够根据自个儿要求,先在沙箱蒙受中打听、组合和调理各样开放接口,举办付出调通工作,进而扶持开垦者在选拔上线核查完毕后,能更敏捷、更流畅的进行线上调整和检验收下工作。
假使在签订左券或创建应用前想要实行合并测验,能够应用沙箱情况

配备的详实表达,请看我前意气风发篇文章:ASP.NET Core 2.0 使用支付宝PC网址支付

在这里个demo里面,首先在AlipayConfig.java里面将部分参数配置好,partner正是pid,然后在将你在地头转移的私钥和在付出账户里面包车型地铁支付宝公钥配置好,接着正是支付成功现在的异步公告url和支出成功之后的页面跳转url(那个和微信不相似,Wechat未有,假使顾客支出成功未来未有苏息页面,那么就能跳转到这一个url,就能够间接拿到支付结果然后改成订单状态了卡塔尔.

//ls_str为参数n_pbfunc_encode lnv_encodestring ls_content,ls_reserved//指明不需要编码的字符ls_reserved =""//都需要编码string ls_sigStrblob utf8Rutf8R =lnv_encode.of_str2utf8lnv_encode.of_URIEncode2return ls_content
//ls_str为参数

n_pbfunc_encode  lnv_encode
string ls_content,ls_reserved//指明不需要编码的字符
ls_reserved =""//都需要编码
string ls_sigStr
blob utf8R
utf8R =lnv_encode.of_str2utf8(ls_str)
lnv_encode.of_URIEncode2(utf8R,ls_content)
return ls_content

ASP.NET Core 2.0 达成扫码支付

利用的生成二维码的构件名称叫QRCoder,该构件引用了贰个第三方完成的System.Drawing类库,当面付SDK为Alipay.AopSdk.F2FPay,已经更新到github和nuget。Nuget: ,github:

新建调整器FTFPayController

1.生成二维码Action

/// <summary>
/// 生成支付二维码
/// </summary>
/// <param name="orderName">订单名称</param>
/// <param name="orderAmount">订单金额</param>
/// <param name="outTradeNo">订单号</param>
/// <returns></returns>
[HttpGet]
public IActionResult ScanCodeGen(string orderName, string orderAmount, string outTradeNo)
{

    AlipayTradePrecreateContentBuilder builder = BuildPrecreateContent(orderName,orderAmount,outTradeNo);

    //如果需要接收扫码支付异步通知,那么请把下面两行注释代替本行。
    //推荐使用轮询撤销机制,不推荐使用异步通知,避免单边账问题发生。
    AlipayF2FPrecreateResult precreateResult = _serviceClient.tradePrecreate(builder);
    //string notify_url = "http://10.5.21.14/Pay/Notify";  //商户接收异步通知的地址
    //AlipayF2FPrecreateResult precreateResult = serviceClient.tradePrecreate(builder, notify_url);

    //以下返回结果的处理供参考。
    //payResponse.QrCode即二维码对于的链接
    //将链接用二维码工具生成二维码打印出来,顾客可以用支付宝钱包扫码支付。
    var bitmap = new Bitmap(Path.Combine(_hostingEnvironment.WebRootPath, "images/error.png"));
    switch (precreateResult.Status)
    {
        case ResultEnum.SUCCESS:
            bitmap.Dispose();
            bitmap=RenderQrCode(precreateResult.response.QrCode);
            //轮询订单结果
            //根据业务需要,选择是否新起线程进行轮询
            ParameterizedThreadStart parStart = new ParameterizedThreadStart(LoopQuery);
            Thread myThread = new Thread(parStart);
            object o = precreateResult.response.OutTradeNo;
            myThread.Start(o);
            break;
        case ResultEnum.FAILED:
            Console.WriteLine("生成二维码失败:"  precreateResult.response.Body);
            break;

        case ResultEnum.UNKNOWN:
            Console.WriteLine("生成二维码失败:"   (precreateResult.response == null ? "配置或网络异常,请检查后重试" : "系统异常,请更新外部订单后重新发起请求"));
            break;
    }
    MemoryStream ms = new MemoryStream();
    bitmap.Save(ms, ImageFormat.Png);
    byte[] bytes = ms.GetBuffer();
    return File(bytes, "image/png");
}

2.布局开销诉求数据

/// <summary>
/// 构造支付请求数据
/// </summary>
/// <param name="orderName">订单名称</param>
/// <param name="orderAmount">订单金额</param>
/// <param name="outTradeNo">订单编号</param>
/// <returns>请求结果集</returns>
private AlipayTradePrecreateContentBuilder BuildPrecreateContent(string orderName,string orderAmount,string outTradeNo)
{
    //线上联调时,请输入真实的外部订单号。
    if (string.IsNullOrEmpty(outTradeNo))
    {
        outTradeNo = System.DateTime.Now.ToString("yyyyMMddHHmmss")   "0000"   (new Random()).Next(1, 10000).ToString();
    }

    AlipayTradePrecreateContentBuilder builder = new AlipayTradePrecreateContentBuilder();
    //收款账号
    builder.seller_id = Config.Uid;
    //订单编号
    builder.out_trade_no = outTradeNo;
    //订单总金额
    builder.total_amount = orderAmount;
    //参与优惠计算的金额
    //builder.discountable_amount = "";
    //不参与优惠计算的金额
    //builder.undiscountable_amount = "";
    //订单名称
    builder.subject = orderName;
    //自定义超时时间
    builder.timeout_express = "5m";
    //订单描述
    builder.body = "";
    //门店编号,很重要的参数,可以用作之后的营销
    builder.store_id = "test store id";
    //操作员编号,很重要的参数,可以用作之后的营销
    builder.operator_id = "test";

    //传入商品信息详情
    List<GoodsInfo> gList = new List<GoodsInfo>();
    GoodsInfo goods = new GoodsInfo();
    goods.goods_id = "goods id";
    goods.goods_name = "goods name";
    goods.price = "0.01";
    goods.quantity = "1";
    gList.Add(goods);
    builder.goods_detail = gList;

    //系统商接入可以填此参数用作返佣
    //ExtendParams exParam = new ExtendParams();
    //exParam.sysServiceProviderId = "20880000000000";
    //builder.extendParams = exParam;

    return builder;

}

3.渲染二维码

/// <summary>
/// 渲染二维码
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private Bitmap RenderQrCode(string str)
{
    QRCodeGenerator.ECCLevel eccLevel = QRCodeGenerator.ECCLevel.L;
    using (QRCodeGenerator qrGenerator = new QRCodeGenerator())
    {
        using (QRCodeData qrCodeData = qrGenerator.CreateQrCode(str, eccLevel))
        {
            using (QRCode qrCode = new QRCode(qrCodeData))
            {

                Bitmap bp= qrCode.GetGraphic(20, Color.Black, Color.White,
                    new Bitmap(Path.Combine(_hostingEnvironment.WebRootPath, "images/alipay.png")), 15);
                return bp;
            }
        }
    }

}

4.轮询支付结果

/// <summary>
/// 轮询支付结果
/// </summary>
/// <param name="o">订单号</param>
public void LoopQuery(object o)
{
    AlipayF2FQueryResult queryResult = new AlipayF2FQueryResult();
    int count = 100;
    int interval = 10000;
    string outTradeNo = o.ToString();

    for (int i = 1; i <= count; i  )
    {
        Thread.Sleep(interval);
        queryResult = _serviceClient.tradeQuery(outTradeNo);
        if (queryResult?.Status == ResultEnum.SUCCESS)
        {
            DoSuccessProcess(queryResult);
            return;
        }
    }
    DoFailedProcess(queryResult);
}

/// <summary>
/// 请添加支付成功后的处理
/// </summary>
private void DoSuccessProcess(AlipayF2FQueryResult queryResult)
{
    //支付成功,请更新相应单据
    Console.WriteLine("扫码支付成功:商户订单号 "   queryResult.response.OutTradeNo);

}

/// <summary>
/// 请添加支付失败后的处理
/// </summary>
private void DoFailedProcess(AlipayF2FQueryResult queryResult)
{
    //支付失败,请更新相应单据
    Console.WriteLine("扫码支付失败:商户订单号 "   queryResult.response.OutTradeNo);
}

有关开采结果,能够运用轮询或然异步通告来得到,异步公告自身这里没条件就不曾事必躬亲,不过代码已经实现了的,本身能够下载德姆o测量试验。

上述代码只是作为示范,实际中利用请根据自个儿的急需来改正,比方轮询应该是用特地的一个或八个后台义务线程来轮询并非种种订单开一个线程,请稳重。

demo里面包车型客车alipayapi.jsp的代码便是发送支付必要的代码,拷贝过去接下来改革部分订单号和商品名已经金额什么的多数就ok了,这中间有好几索要小心,便是急需在response里面安装编码为utf-8,不然在支付宝支付的页面里面商品名就能够有汉语乱码,然后return_url.jsp里面包车型客车代码和notify_url.jsp都大约,改良校正就足以一向动用了.

上述所述是小编给大家介绍的运用PBFunc在Powerbuilder中支付宝当面付款效能,希望对我们持有利于,如若大家有别的难题应接给本人留言,作者会及时回复的。

  demo代码详见w_rsa窗体的SHA1WithLacrosseSA按键下载地址:

Demo演示

1.生成二维码

生成二维码必得提供专营商订单号、订单金额、订单名称八个参数,不然晤面世谬误。

澳门新萄京 5

2.扫描支付

展开手机支付宝,点开扫一扫,扫描二维码完毕付款。

风流罗曼蒂克经应用的是沙箱处境,那么必需下载沙箱版支付宝,使用正规版支付宝扫描沙箱意况api生成的二维码,汇合世二维码失效,沙箱情状后台能够下载。沙箱情形必需运用沙箱情形账号。

(1)扫码之后:

澳门新萄京 6

(2)支付成功:

澳门新萄京 7

澳门新萄京 8

3.支出结果

通过轮询拿到的结果:

澳门新萄京 9

澳门新萄京 10

以为支付宝支出恐怕蛮轻便的,相对于Wechat,貌似Wechat未有java的demo,什么须求都供给和煦手动写.

地址集结

前后生可畏篇文章:ASP.NET Core 2.0 使用支付宝PC网址支付

当面付官方文书档案:

Nuget组件:

QRCoder(二维码生成):

澳门新萄京:支出宝当面付之扫码支付,java支付宝支付。Alipay.AopSdk.F2FPay(当面付SDK):

付出宝当面给予劳务端SDK:

本文Demo

设若您以为对你有用,接待来个star!

本文由澳门新萄京发布于服务器,转载请注明出处:澳门新萄京:支出宝当面付之扫码支付,java支付

上一篇:ES6新特征数字,关于ES6扩展属性 下一篇:没有了
猜你喜欢
热门排行
精彩图文