下单 submitCat :totalprice productIds pay_way addressId couponid-------->oid isNeedPay payway
支付:charge:oid price payway
appid partnerid prepayid packagevalue nonceStr timestamp sign
用户打开商品app客户端 ,选择商品下单 请求生成支付订单 商品客户端后台调用统一下单api 在微信后台生成预付订单 返回预付信息 prepayid 到客户端后台客户端生成一个签名文件 客户端后台 返回prepayid 与sign到客户端 用户确认支付,客户端支付参数通过调用sdk 吊起微信支付 ,微信发起支付请求 微信后台验证支付参数和支付权限 然后返回需要支付授权 用户确认授权 输入密码 然后通过微信客户端提交支付授权给微信后台 微信后台验证授权 完成交易。
微信支付主要是采用了https+签名算法加密
签名加密两步走 :
第一步 :设接收到和发送的数据 为集合M,将集合M内非空参数按照ASCII码从小到大进行排序,使用url键值对的方式拼接成String字符串A 。
第二步:
在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue
假设传送的参数如下:
appid: wxd930ea5d5a258f4f
mch_id: 10000100
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接API密钥:
stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" //注:key为商户平台设置的密钥key
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注:MD5签名方式
sign=hash_hmac("sha256",stringSignTemp,key).toUpperCase()="6A9AE1657590FD6257D693A078E1C3E4BB6BA4DC30B23E0EE2496E54170DACD6" //注:HMAC-SHA256签名方式